mongodb - 查询 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})
解决方案
您可以使用$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 } }
])
推荐阅读
- r - R中Vroom包中列号的列名
- css - 我怎样才能让弹性项目双向增长
- json - 如何在 Angular 中将嵌套的 json 对象读取到表中?
- fortran - Fortran 中 (1) 的赋值中不兼容的等级 0 和 1
- css - 当我调整窗口 CSS 大小时,图像与文本重叠
- javascript - 将模块和命名空间添加到同一 TS 声明文件时出现问题
- python - AttributeError:模块“librosa”没有属性“输出”
- java - 在 Spring JPA 中避免 SQL 注入
- python - 为什么命名python文件“.py”没有突出显示
- c - 如何使用 fprintf 将缓冲区内容写入/保存到 C 中的文件