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