Es ist immer eine gute Idee, sich der Speicherressourcen bewusst zu sein, wenn $unwind
aufgrund der auftretenden Replikation von Daten.
Verwenden von $match
Das Eingrenzen der Ergebnisse auf die spezifischen Dokumente, nach denen Sie suchen, ist natürlich eine Möglichkeit, den Speicherplatz zu reduzieren, der zum Speichern der zurückgegebenen Daten erforderlich ist.
Eine andere Möglichkeit, den Speicherbedarf zu reduzieren, ist $project
. $project
ermöglicht es Ihnen, die Dokumente in der Pipeline neu zu organisieren, sodass Sie nur die Elemente zurückgeben, an denen Sie interessiert sind.
Um Ihr Beispiel zu verwenden,
{
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"}
]
}
]
}
Mit
db.collection.aggregate([{ $match: { <element>: <value> }}, { $project: { _id: 0, answers: 1}}])
entfernt die someInfo
und andere Attribute, an denen Sie vielleicht nicht interessiert sind. Dann könnten Sie $project
wieder nach dem Abwickeln...
db.collection.aggregate([
{ $match: { <element>: <value> }},
{ $project: { _id: 0, answers: 1}},
{ $unwind: "$answers"},
{ $unwind: "$answers.tags"},
{ $project: { e: "$answers.email", v: "$answers.values"}}
])
liefert ziemlich kompakte Ergebnisse wie:
{ 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" } }
Obwohl die Attributnamen aus einem Buchstaben die Lesbarkeit für Menschen verringern, wird die Größe der Daten verringert, die durch lange, wiederholte Attributnamen aufgeblasen werden.