【问题标题】:Return only specific fields from projection array sub-document仅返回投影数组子文档中的特定字段
【发布时间】:2014-06-08 21:07:39
【问题描述】:

我正在查看 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})

我希望它只在子文档下返回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.$ 的字段子集 而不是整个子文档?

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

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

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

    【讨论】:

    • 我不知道聚合可以完成我想做的事情,因为我没有聚合多个文档。
    • 但是如果不能使用聚合怎么办?我对此有点困惑,因为您可以使用 $ 运算符并在更新中访问子字段,如下所示:db.students.update( { _id: 4, "grades.grade": 85 }, { $set: { "grades.$.std" : 6 } } )
    猜你喜欢
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多