在以下情况下了解内存资源始终是一个好主意$unwind http://docs.mongodb.org/manual/reference/operator/aggregation/unwind/由于发生数据复制。
Using $match http://docs.mongodb.org/manual/reference/operator/aggregation/match/将结果范围缩小到您要查找的特定文档当然是减少保存返回数据所需的内存量的一种方法。
减少内存占用的另一种方法是$project http://docs.mongodb.org/manual/reference/operator/aggregation/project/. $project
允许您重新组织管道中的文档,以便仅返回您感兴趣的元素。
要使用你的例子,
{
someInfo: "blah blah blah",
answers: [
{
email: "[email protected] /cdn-cgi/l/email-protection",
values: [
{value: 1, label: "test1"},
{value: 2, label: "test2"}
]
},
{
email: "[email protected] /cdn-cgi/l/email-protection",
values: [
{value: 6, label: "test1"},
{value: 1, label: "test2"}
]
}
]
}
With
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] /cdn-cgi/l/email-protection", v: { value: 1, label: "test1" } }
{ e: "[email protected] /cdn-cgi/l/email-protection", v: { value: 2, label: "test2" } }
{ e: "[email protected] /cdn-cgi/l/email-protection", v: { value: 6, label: "test1" } }
{ e: "[email protected] /cdn-cgi/l/email-protection", v: { value: 1, label: "test2" } }
尽管单字母属性名称降低了人类可读性,但它确实减少了因冗长的重复属性名称而膨胀的数据大小。