Vždy je dobré mít na paměti paměťové zdroje, když $unwind
z důvodu replikace dat, ke které dochází.
Pomocí $match
zúžit výsledky na konkrétní dokumenty, které hledáte, je samozřejmě jedním ze způsobů, jak snížit množství paměti potřebné k uložení vrácených dat.
Dalším způsobem, jak snížit nároky na paměť, je $project
. $project
umožňuje přeuspořádat dokumenty v kanálu tak, že vrátíte pouze prvky, které vás zajímají.
Chcete-li použít váš příklad,
{
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"}
]
}
]
}
S
db.collection.aggregate([{ $match: { <element>: <value> }}, { $project: { _id: 0, answers: 1}}])
odstraní someInfo
a další atributy, které vás nemusí zajímat. Pak můžete $project
znovu po odvinutí...
db.collection.aggregate([
{ $match: { <element>: <value> }},
{ $project: { _id: 0, answers: 1}},
{ $unwind: "$answers"},
{ $unwind: "$answers.tags"},
{ $project: { e: "$answers.email", v: "$answers.values"}}
])
vrátí poměrně kompaktní výsledky jako:
{ 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" } }
Jednopísmenné názvy atributů sice snižují čitelnost pro člověka, ale snižují velikost dat, která je nahuštěna dlouhými opakovanými názvy atributů.