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: "example@sqldat.com",
values: [
{value: 1, label: "test1"},
{value: 2, label: "test2"}
]
},
{
email: "example@sqldat.com",
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: "example@sqldat.com", v: { value: 1, label: "test1" } }
{ e: "example@sqldat.com", v: { value: 2, label: "test2" } }
{ e: "example@sqldat.com", v: { value: 6, label: "test1" } }
{ e: "example@sqldat.com", 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.