sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Consecuencias de usar $ unwind en arreglos anidados?

Siempre es una buena idea conocer los recursos de memoria cuando $unwind ing debido a la replicación de datos que se produce.

Usando $match reducir los resultados a los documentos específicos que está buscando es, por supuesto, una forma de reducir la cantidad de memoria necesaria para almacenar los datos devueltos.

Otra forma de reducir la huella de memoria es con $project . $project le permite reorganizar los documentos en proceso para que solo devuelva los elementos que le interesan.

Para usar tu ejemplo,

{
  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"}    
      ]
    }
  ]
}

Con

db.collection.aggregate([{ $match: { <element>: <value> }}, { $project: { _id: 0, answers: 1}}])

eliminará el someInfo y otros atributos que quizás no le interesen. Entonces podría $project de nuevo después de relajarse...

db.collection.aggregate([
   { $match: { <element>: <value> }},
   { $project: { _id: 0, answers: 1}},
   { $unwind: "$answers"},
   { $unwind: "$answers.tags"},
   { $project: { e: "$answers.email", v: "$answers.values"}}
])

devolverá 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" } }

Aunque los nombres de atributos de una sola letra reducen la legibilidad humana, reducen el tamaño de los datos que se inflan con nombres de atributos largos y repetidos.