É sempre uma boa ideia estar ciente dos recursos de memória quando
$descontrair
devido à replicação de dados que ocorre. Usando
$match
restringir os resultados aos documentos específicos que você está procurando é, obviamente, uma maneira de reduzir a quantidade de memória necessária para armazenar os dados retornados. Outra maneira de reduzir o consumo de memória é com
$project
. $projeto
permite reorganizar os documentos no pipeline para que você retorne apenas os elementos nos quais está interessado. Para usar seu exemplo,
{
someInfo: "blah blah blah",
answers: [
{
email: "[email protected]",
values: [
{value: 1, label: "test1"},
{value: 2, label: "test2"}
]
},
{
email: "[email protected]",
values: [
{value: 6, label: "test1"},
{value: 1, label: "test2"}
]
}
]
}
Com
db.collection.aggregate([{ $match: { <element>: <value> }}, { $project: { _id: 0, answers: 1}}])
irá remover o
someInfo
e outros atributos nos quais você pode não estar interessado. Então você pode $project
novamente depois de descontrair... db.collection.aggregate([
{ $match: { <element>: <value> }},
{ $project: { _id: 0, answers: 1}},
{ $unwind: "$answers"},
{ $unwind: "$answers.tags"},
{ $project: { e: "$answers.email", v: "$answers.values"}}
])
retornará resultados bastante compactos como:
{ e: "[email protected]", v: { value: 1, label: "test1" } }
{ e: "[email protected]", v: { value: 2, label: "test2" } }
{ e: "[email protected]", v: { value: 6, label: "test1" } }
{ e: "[email protected]", v: { value: 1, label: "test2" } }
Embora os nomes de atributos de uma única letra reduzam a legibilidade humana, eles reduzem o tamanho dos dados que são inflados por nomes de atributos longos e repetidos.