sql >> Databasteknik >  >> NoSQL >> MongoDB

Konsekvenser av att använda $unwind på kapslade arrayer?

Det är alltid en bra idé att vara medveten om minnesresurser när $unwind på grund av replikeringen av data som inträffar.

Använda $match att begränsa resultaten till de specifika dokument du letar efter är naturligtvis ett sätt att minska mängden minne som krävs för att lagra de returnerade data.

Ett annat sätt att minska minnesavtrycket är med $project . $project låter dig organisera om dokumenten i pipelinen så att du bara returnerar de element som du är intresserad av.

För att använda ditt exempel,

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

Med

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

kommer att ta bort someInfo och andra attribut som du kanske inte är intresserad av. Då kan du $project igen efter att varva ner...

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

kommer att returnera ganska kompakta resultat som:

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

Även om namnen på enbokstavsattribut minskar läsbarheten för människor, minskar det storleken på data som blåses upp av långa upprepade attributnamn.




  1. Mongoose tar slut och kastar undantag

  2. Hur hämtar man alla matchande element som finns i arrayen i Mongo DB?

  3. Spring Data MongoDB BigDecimal-stöd

  4. hämta dokumentet med $box med mongodb och lägg till avståndsfält för varje post med specifik koordinatpunkt