首页 > 解决方案 > 查询 ElemMatch 数组中的数组

问题描述

我正在尝试根据嵌套在数组和使用 elemMatch 的第二个数组中的值查询集合和过滤器。

{
"email": "user1@email.com",
"project" [ {
                projectId: ObjectId("123"),
                preference: [
                            {"name": "name1", "value": true},
                            {"name": "name2", "value": false}
                ]
            }, 
            {
                projectId: ObjectId("456"),
                preference: [
                            {"name": "name1", "value": true},
                            {"name": "name2", "value": true}
                ]
            }
]
}, 
{
"email": "user2@email.com",
"project" [ {
                projectId: ObjectId("123"),
                preference: [
                            {"name": "name1", "value": false},
                            {"name": "name2", "value": true}
                ]
            }, 
            {
                projectId: ObjectId("456"),
                preference: [
                            {"name": "name1", "value": true},
                            {"name": "name2", "value": true}
                ]
            }
]
}

我尝试了几种不同的变体,将以下两个查询合并为一个,以尝试实现返回的目标。

{电子邮件:“user1@email.com”}

db.user.find({"project":{"$elemMatch":{"projectId":ObjectId("123")}}}, {email: 1})
db.user.find({"project.preference":{"$elemMatch":{"$and":[{"name":"name1"}, {"value": true}]}}}, {email: 1})

标签: mongodb

解决方案


您可以使用$unwind来简化查询多层嵌套数组,尝试:

db.user.aggregate([
    {  $unwind: "$project" },
    {  $match: { "project.projectId": "123" } },
    {  $unwind: "$project.preference" },
    {  $match: { "project.preference.name": "name1", "project.preference.value": true } },
    {  $project: { _id: 0, email: 1 } }
])

推荐阅读