MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Consequências do uso de $ unwind em matrizes aninhadas?


É 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.