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

11
我正在查看MongoDB关于$$elemMatch投影的文档。我试图弄清楚如何仅返回投影数组的一部分字段,但似乎无法弄清楚。
相关帖子: 假设我在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})

我希望它只返回子文档中key1的数组下的name。例如,
{
    "_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个回答

9

你是否特别想做到这一点而不使用聚合功能?

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

我之前不知道聚合可以实现我想做的事情,因为我没有聚合多个文档。 - Uyghur Lives Matter
6
如果不能使用聚合怎么办?我有点困惑,因为您可以使用$符号并像这样访问更新中的子字段:db.students.update( { _id: 4, "grades.grade": 85 }, { $set: { "grades.$.std" : 6 } } ) - Bilk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接