Det er altid en god idé at være opmærksom på hukommelsesressourcer, når $slap af
på grund af den replikering af data, der opstår.
Brug af $match
at indsnævre resultaterne til de specifikke dokumenter, du leder efter, er naturligvis en måde at reducere mængden af hukommelse, der er nødvendig for at opbevare de returnerede data.
En anden måde at reducere hukommelsesfodaftrykket på er med $project
. $projekt
giver dig mulighed for at omorganisere dokumenterne i pipelinen, så du kun returnerer de elementer, du er interesseret i.
For at bruge dit eksempel,
{
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}}])
vil fjerne someInfo
og andre attributter, du måske ikke er interesseret i. Så kan du $projekt
igen efter afvikling...
db.collection.aggregate([
{ $match: { <element>: <value> }},
{ $project: { _id: 0, answers: 1}},
{ $unwind: "$answers"},
{ $unwind: "$answers.tags"},
{ $project: { e: "$answers.email", v: "$answers.values"}}
])
vil returnere ret kompakte resultater 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" } }
Selvom enkeltbogstavs attributnavne reducerer menneskelig læsbarhed, skærer det ned på størrelsen af de data, der er oppustet af lange gentagne attributnavne.