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

use*_*450 9 mongodb mongodb-query

我正在查看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": {}
}
Run Code Online (Sandbox Code Playgroud)

我有效地想要执行的查询是:

db.test.findOne({"array.key": 1}, {"array.$.name": 1, "extra": 1})
Run Code Online (Sandbox Code Playgroud)

我希望它只是返回name在数组中的子文件下key1.例如,

{
    "_id": "A",
    "array": [
        {"name": "foo"}
    ],
    "extra": {}
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我执行该查询,我得到的是:

{
    "_id": "A",
    "array": [
        {"key": 1, "name": "foo", "data": {}}
    ],
    "extra": {}
}
Run Code Online (Sandbox Code Playgroud)

这与执行查询相同:

db.test.findOne({"array.key": 1}, {"array.$": 1, "extra": 1})
Run Code Online (Sandbox Code Playgroud)

我也尝试过以下结果:

db.test.findOne({"array.key": 1}, {"array.$": 1, "array.name": 1, "extra": 1})
Run Code Online (Sandbox Code Playgroud)

有没有办法只返回字段的子集array.$ 而不是整个子文档?

小智 7

你是否特意尝试不使用聚合这样做?

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

  • 但是,如果你不能使用聚合怎么办?我对此有点困惑,因为您可以使用$运算符并访问更新中的子字段,如下所示:`db.students.update({_ id:4,"grades.grade":85},{$ set:{"grade.$.std":6}})` (6认同)