仅返回投影数组子文档中的特定字段

时间:2014-04-23 20:17:16

标签: mongodb mongodb-query

我在$$elemMatch上查看MongoDB的文档 预测。我试图弄清楚如何只返回一个子集 投影阵列的字段,但我似乎无法弄明白。

相关帖子:

说我在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 key1的数组。如,

{
    "_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.$字段的子集 而不是整个子文件?

1 个答案:

答案 0 :(得分:7)

您是否特意尝试在不使用聚合的情况下执行此操作?

db.test.aggregate([{$unwind:"$array"},
                   {$match:{"array.key":1}},
                   {$project:{"array.name":1, extra:1}}])