Arrays MongoDb,如何返回字符串数组中的特定项?

Arrays MongoDb,如何返回字符串数组中的特定项?,arrays,string,mongodb,Arrays,String,Mongodb,我是mongo世界的新手,我遇到了麻烦 [ { "name" :"name 1", "roles" : [ { "clientId" : 1, "groups" : [ "group 1", "group 2", "group 3",

我是mongo世界的新手,我遇到了麻烦

[
    {
        "name" :"name 1",
        "roles" : [
            {
                "clientId" : 1,
                "groups" : [
                    "group 1",
                    "group 2",
                    "group 3",
                ]
            },
            {
                "clientId" : 2,
                "groups" : [
                    "group 1"
                ]
            }
        ]

    }
]
我有两个过滤器clientId

如果我发送:

  • 客户编号:1
  • 组别:[‘组别1’、‘组别2’]
我需要返回带有数组的项,但只返回内部的项,如:

[
    {
        "name" :"name 1",
        "roles" : [
            {
                "clientId" : 1,
                "groups" : [
                    "group 1",
                    "group 2",
                ]
            }
        ]

    }
]
我在组内使用$,但它总是返回数组中的所有项

我不知道怎么做,比如$elemMatch,但是字符串数组

有什么想法吗


非常感谢使用
$elemMatch
如下:

db.collection.find({"roles":{"$elemMatch":{"clientId":1,"groups":{"$in":["group 1", "group 2"]}}}},{"roles.$":1,"name":1}).pretty()
您可以使用获取所需的文档。下面的聚合管道使用操作符作为第一阶段来过滤进入管道的集合中的文档。接下来的两个管道阶段是操作符,它从输入文档解构数组字段,为每个元素输出一个文档。每个输出文档都用元素值替换数组

需要进一步的管道,然后从解构的数组中筛选文档

下一个管道按
\u id
表达式对输入文档进行分组,并将累加器表达式应用于每个组,以保留原始数组字段:

db.collection.aggregate([
    {
        "$match": {
            "roles.clientId": 1,
            "roles.groups": { "$in": ["group 1", "group 2"] }
        }
    },
    { "$unwind": "$roles" },
    { "$unwind": "$roles.groups" },
    {
        "$match": {
            "roles.clientId": 1,
            "roles.groups": { "$in": ["group 1", "group 2"] }
        }
    },
    {
        "$group": {
            "_id": "$_id",
            "groups": { "$push": "$roles.groups" },
            "clientId": { "$first": "$roles.clientId" }
        } 
    },
    {
        "$group": {
            "_id": "$_id",
            "roles": { 
                "$push": {
                    "groups": "$groups",
                    "clientId": "$clientId" 
                }
            }
        } 
    }
])
输出

/* 0 */
{
    "result" : [ 
        {
            "_id" : ObjectId("55885ce782b3e628fee8c63b"),
            "roles" : [ 
                {
                    "groups" : [ 
                        "group 1", 
                        "group 2"
                    ],
                    "clientId" : 1
                }
            ]
        }
    ],
    "ok" : 1
}