Arrays 如何从MongoDB中的子文档数组中只返回一个匹配的子文档(而不是数组)?

Arrays 如何从MongoDB中的子文档数组中只返回一个匹配的子文档(而不是数组)?,arrays,mongodb,subdocument,Arrays,Mongodb,Subdocument,在我的收藏中: { "code": xx1 "valueList": [ { "id": "yy1", "name": "name1"}, { "id": "yy2", "name": "name2"}, { "id": "yy3", "name": "name3"} ] }, { "code": xx2 "valueLis

在我的收藏中:

{ "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" }]
 }

我怎样才能解决这个问题?谢谢

您可以使用以下聚合:

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

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

它可以工作,但返回一个数组:[{“id”:“yy3”,“name”:“name3”}。它是否可以只返回子文档本身而不返回数组:{“id”:“yy3”,“name”:“name3”}(注意:不带[]),这样就完美了,谢谢you@elvin,这需要在应用程序逻辑中处理,聚合和查找将始终返回一个数组,即使它是一个元素数组