の場合は、メモリリソースを認識することをお勧めします。 $ unwind
発生するデータの複製のために。
$ match
を使用する
結果を探している特定のドキュメントに絞り込むことは、もちろん、返されたデータを保持するために必要なメモリの量を減らす1つの方法です。
メモリフットプリントを削減するもう1つの方法は、 $ 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" } }
1文字の属性名は人間の読みやすさを低下させますが、長く繰り返される属性名によって膨らむデータのサイズを削減します。