我在$
和$elemMatch
上查看MongoDB的文档
预测。我试图弄清楚如何只返回一个子集
投影阵列的字段,但我似乎无法弄明白。
相关帖子:
我没有尝试从$slice执行mongodb aggregation framework - Fetch first document's field of the nested array。
我也没有尝试从Return only array value in mongo projection展平子文档,因为我仍然需要顶层文档中的某些字段。
说我在test
集合中有以下文件:
{
"_id": "A",
"array": [
{"key": 1, "name": "foo", "data": {}},
{"key": 2, "name": "bar", "data": {}}
],
"extra": {}
},
{
"_id": "B",
"array": [
{"key": 3, "name": "spam", "data": {}},
{"key": 4, "name": "eggs", "data": {}}
],
"extra": {}
}
我有效地想要执行的查询是:
db.test.findOne({"array.key": 1}, {"array.$.name": 1, "extra": 1})
我希望它只返回{}下的子文档下的name
key
为1
的数组。如,
{
"_id": "A",
"array": [
{"name": "foo"}
],
"extra": {}
}
但如果我执行该查询,我会改为:
{
"_id": "A",
"array": [
{"key": 1, "name": "foo", "data": {}}
],
"extra": {}
}
与查询相同:
db.test.findOne({"array.key": 1}, {"array.$": 1, "extra": 1})
我也尝试过以下结果:
db.test.findOne({"array.key": 1}, {"array.$": 1, "array.name": 1, "extra": 1})
有没有办法只返回array.$
字段的子集
而不是整个子文件?
答案 0 :(得分:7)
您是否特意尝试在不使用聚合的情况下执行此操作?
db.test.aggregate([{$unwind:"$array"},
{$match:{"array.key":1}},
{$project:{"array.name":1, extra:1}}])