【问题标题】:How to return only ONE matching subdocument (not array) from subdocument array in MongoDB?如何从 MongoDB 的子文档数组中只返回一个匹配的子文档(不是数组)?
【发布时间】:2019-07-09 18:10:48
【问题描述】:

在我的收藏中:

{ "code": xx1
  "valueList": [
                  { "id": "yy1", "name": "name1"},
                  { "id": "yy2", "name": "name2"},
                  { "id": "yy3", "name": "name3"}              
               ]
},
{ "code": xx2
  "valueList": [
                  { "id": "yy4", "name": "name4"},
                  { "id": "yy5", "name": "name5"},
                  { "id": "yy6", "name": "name6"}              
               ]
}

我想返回一个特定的匹配子文档(不是数组),如下所示:

{ "id": "yy3", "name": "name3"}  

我试试下面的代码:

findOne({ "code": "xx1",
          "valueList.name": "yy3"
       })
.select({ "valueList.$": 1});

它返回一个数组:

 {
   "valueList": [{ "id": "yy3", "name": "name3" }]
 }

我该如何解决这个问题?谢谢

【问题讨论】:

    标签: arrays mongodb subdocument


    【解决方案1】:

    您可以使用以下聚合:

    db.col.aggregate([
        { $match: { "valueList.id": "yy3" } },
        { $unwind: "$valueList" },
        { $match: { "valueList.id": "yy3" } },
        { $replaceRoot: { newRoot: "$valueList" } }
    ])
    

    首先$match 将过滤掉所有不必要的文档,然后您可以使用$unwind 获取每个文档的valueList 项目,然后再次$match 以在最后阶段仅获取带有yy3 的项目,您可以使用$replaceRootvalueList 项目提升到顶层。

    【讨论】:

    • 它可以工作,但返回一个数组:[{ "id": "yy3", "name": "name3"} ]。是否有可能只返回没有数组的子文档本身:{“id”:“yy3”,“name”:“name3”}(注意:没有[])?那就完美了,谢谢
    • @elvin,需要在您的应用逻辑中处理,聚合和查找将始终返回一个数组,即使它是单元素数组
    猜你喜欢
    • 2019-01-16
    • 1970-01-01
    • 2019-09-03
    • 2020-09-22
    • 2014-05-28
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多