Itu selalu merupakan ide yang baik untuk menyadari sumber daya memori ketika $unwind
ing karena replikasi data yang terjadi.
Menggunakan $match
untuk mempersempit hasil ke dokumen tertentu yang Anda cari tentu saja merupakan salah satu cara untuk mengurangi jumlah memori yang diperlukan untuk menyimpan data yang dikembalikan.
Cara lain untuk mengurangi jejak memori adalah dengan $project
. $project memungkinkan Anda untuk mengatur ulang dokumen dalam alur sehingga Anda hanya mengembalikan elemen yang Anda minati.
Untuk menggunakan contoh Anda,
{
someInfo: "blah blah blah",
answers: [
{
email: "example@sqldat.com",
values: [
{value: 1, label: "test1"},
{value: 2, label: "test2"}
]
},
{
email: "example@sqldat.com",
values: [
{value: 6, label: "test1"},
{value: 1, label: "test2"}
]
}
]
}
Dengan
db.collection.aggregate([{ $match: { <element>: <value> }}, { $project: { _id: 0, answers: 1}}])
akan menghapus someInfo dan atribut lain yang mungkin tidak Anda minati. Kemudian Anda dapat $project lagi setelah melepas lelah...
db.collection.aggregate([
{ $match: { <element>: <value> }},
{ $project: { _id: 0, answers: 1}},
{ $unwind: "$answers"},
{ $unwind: "$answers.tags"},
{ $project: { e: "$answers.email", v: "$answers.values"}}
])
akan mengembalikan hasil yang cukup ringkas seperti:
{ e: "example@sqldat.com", v: { value: 1, label: "test1" } }
{ e: "example@sqldat.com", v: { value: 2, label: "test2" } }
{ e: "example@sqldat.com", v: { value: 6, label: "test1" } }
{ e: "example@sqldat.com", v: { value: 1, label: "test2" } }
Meskipun nama atribut huruf tunggal mengurangi keterbacaan manusia, hal itu mengurangi ukuran data yang dibesar-besarkan oleh nama atribut yang berulang-ulang.