MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Conseguenze dell'utilizzo di $unwind su array nidificati?

È sempre una buona idea essere consapevoli delle risorse di memoria quando $unwind ing a causa della replica dei dati che si verifica.

Utilizzo di $match restringere i risultati ai documenti specifici che stai cercando è ovviamente un modo per ridurre la quantità di memoria necessaria per contenere i dati restituiti.

Un altro modo per ridurre l'ingombro di memoria è con $project . $project ti permette di riorganizzare i documenti in cantiere in modo da restituire solo gli elementi che ti interessano.

Per usare il tuo esempio,

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

rimuoverà someInfo e altri attributi che potrebbero non interessarti. Quindi potresti $project di nuovo dopo lo svolgimento...

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

restituirà risultati abbastanza compatti come:

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

Sebbene i nomi di attributi a lettera singola riducano la leggibilità umana, riducono la dimensione dei dati che viene gonfiata da nomi di attributi lunghi e ripetuti.