Het is altijd een goed idee om op de hoogte te zijn van geheugenbronnen wanneer $unwind
vanwege de replicatie van gegevens die optreedt.
$match gebruiken
om de resultaten te beperken tot de specifieke documenten waarnaar u op zoek bent, is natuurlijk een manier om de hoeveelheid geheugen die nodig is om de geretourneerde gegevens te bewaren, te verminderen.
Een andere manier om de geheugenvoetafdruk te verkleinen is met $project
. $project stelt u in staat om de documenten in de pijplijn te reorganiseren, zodat u alleen de elementen retourneert waarin u geïnteresseerd bent.
Om uw voorbeeld te gebruiken:
{
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"}
]
}
]
}
Met
db.collection.aggregate([{ $match: { <element>: <value> }}, { $project: { _id: 0, answers: 1}}])
zal de someInfo . verwijderen en andere attributen waarin u misschien niet geïnteresseerd bent. Dan kunt u $project weer na het ontspannen...
db.collection.aggregate([
{ $match: { <element>: <value> }},
{ $project: { _id: 0, answers: 1}},
{ $unwind: "$answers"},
{ $unwind: "$answers.tags"},
{ $project: { e: "$answers.email", v: "$answers.values"}}
])
zal vrij compacte resultaten opleveren zoals:
{ 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" } }
Hoewel de attribuutnamen met één letter de leesbaarheid voor mensen verminderen, vermindert het de grootte van de gegevens die wordt opgeblazen door lange herhaalde attribuutnamen.