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.