Zawsze dobrze jest być świadomym zasobów pamięci, gdy $odpręż
z powodu replikacji danych, która ma miejsce.
Korzystanie z $match
zawężenie wyników do konkretnych dokumentów, których szukasz, jest oczywiście jednym ze sposobów zmniejszenia ilości pamięci niezbędnej do przechowywania zwróconych danych.
Innym sposobem na zmniejszenie zużycia pamięci jest użycie $project
. $projekt
pozwala na reorganizację dokumentów w potoku, tak aby zwracać tylko te elementy, którymi jesteś zainteresowany.
Aby użyć swojego przykładu,
{
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"}
]
}
]
}
Z
db.collection.aggregate([{ $match: { <element>: <value> }}, { $project: { _id: 0, answers: 1}}])
usunie niektóreinformacje
i inne atrybuty, którymi możesz nie być zainteresowany. Wtedy możesz $project
ponownie po rozwinięciu...
db.collection.aggregate([
{ $match: { <element>: <value> }},
{ $project: { _id: 0, answers: 1}},
{ $unwind: "$answers"},
{ $unwind: "$answers.tags"},
{ $project: { e: "$answers.email", v: "$answers.values"}}
])
zwróci dość zwięzłe wyniki, takie jak:
{ 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" } }
Chociaż jednoliterowe nazwy atrybutów zmniejszają czytelność dla ludzi, zmniejszają rozmiar danych, które są powiększane przez długie, powtarzające się nazwy atrybutów.