首页 > 解决方案 > 从 mongodb 的文档中获取匹配的数组元素

问题描述

假设我在 mongodb 中有这些文件:

{
    "_id" : ObjectId("512e28984815cbfcb21646a7"),
    "myList" : [
        {
            "a" : true,
            "b" : mydata1
        },
        {
            "a" : true
            "b" : mydata2
        },
        {
            "a" : false
            "b" : mydata3
        },
        {
            "a" : false
            "b" : mydata4
        },
        {
            "a" : true
            "b" : mydata5
        }
    ]
}

我想获取所有包含“ a:true ”的数组单元格。

我尝试了 mongodb find(),但它只返回单个第一个匹配,这是一个问题。

我最终使用了 $filter因为我不想使用$unwind(性能问题)。

试图执行这一行,不起作用:

.aggregate([
{$match: {_id: NUUID("d75dcc8d-ecb2-4d23-99d5-347bc99cfeec")}}, 
{$project:
    {
        myList: 
        {
            $filter: {
                input: '$myList',
                as: 'myElement',
                cond: {$eq: [{'$$myElement.a': true}]}
        }}
    }
 }
 ])

但这似乎不起作用,它说 $$ 未被识别。我徘徊我错过了什么,为什么不能使用 find() ?使用项目请求数组中的某些元素听起来很基本。

标签: mongodbmongodb-query

解决方案


对我来说正在工作(分片集群版本 4.4.3):

mongos> db.e.find()
{ "_id" : ObjectId("512e28984815cbfcb21646a7"), "myList" : [ { "a" : true, "b" : "mydata1" }, { "a" : true, "b" : "mydata2" }, { "a" : false, "b" : "mydata3" }, { "a" : false, "b" : "mydata4" }, { "a" : true, "b" : "mydata5" } ] }
{ "_id" : ObjectId("512e28984815cbfcb21646a8"), "myList" : [ { "a" : true, "b" : "mydata1" }, { "a" : true, "b" : "mydata2" }, { "a" : false, "b" : "mydata3" }, { "a" : false, "b" : "mydata4" }, { "a" : true, "b" : "mydata5" }, { "a" : true, "b" : "mydata6" } ] }

mongos> db.e.aggregate({$project: { myList: { $filter:{  input:"$myList" , as:"element" , cond: {$eq:[ "$$element.a",true  ] }               }   }         }})
{ "_id" : ObjectId("512e28984815cbfcb21646a7"), "myList" : [ { "a" : true, "b" : "mydata1" }, { "a" : true, "b" : "mydata2" }, { "a" : true, "b" : "mydata5" } ] }
{ "_id" : ObjectId("512e28984815cbfcb21646a8"), "myList" : [ { "a" : true, "b" : "mydata1" }, { "a" : true, "b" : "mydata2" }, { "a" : true, "b" : "mydata5" }, { "a" : true, "b" : "mydata6" } ] }
mongos> 

推荐阅读