Винаги е добра идея да сте наясно с ресурсите на паметта, когато $unwind
поради репликацията на данни, която възниква.
Използване на $match
стесняването на резултатите до конкретните документи, които търсите, разбира се, е един от начините за намаляване на количеството памет, необходимо за съхраняване на върнатите данни.
Друг начин за намаляване на отпечатъка от паметта е с $projectкод>
. $project
ви позволява да реорганизирате документите в конвейера, така че да върнете само елементите, които ви интересуват.
За да използвам вашия пример,
{
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"}
]
}
]
}
С
db.collection.aggregate([{ $match: { <element>: <value> }}, { $project: { _id: 0, answers: 1}}])
ще премахне someInfo
и други атрибути, които може да не ви интересуват. Тогава можете да $project
отново след размотаване...
db.collection.aggregate([
{ $match: { <element>: <value> }},
{ $project: { _id: 0, answers: 1}},
{ $unwind: "$answers"},
{ $unwind: "$answers.tags"},
{ $project: { e: "$answers.email", v: "$answers.values"}}
])
ще върне доста компактни резултати като:
{ 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" } }
Въпреки че еднобуквените имена на атрибути намаляват четимостта от хора, те намаляват размера на данните, които се раздуват от дълги повтарящи се имена на атрибути.