javascript - 如何在集合中过滤mongoDB中的查询
问题描述
我正在尝试在 mongoDB 中进行过滤,但没有得到预期的输出。我正在使用$elemMatch
但仍然没有得到预期。
代理收款
[
{
"_id": "5d402d36035f3063657240ac",
"name": "test agency",
"msisdn": "99961110278",
"apps": [
{
"pincodes": [
"135001",
"122018"
],
"_id": "5d402d36035f3063657240ae",
"name": "DSB"
},
{
"pincodes": [
"135001",
"122017"
],
"_id": "5d402d36035f3063657240ad",
"name": "DBH"
}
],
"__v": 0
}
]
查询shell
db.Agency.find({'apps':{$elemMatch:{name: {$regex: 'DSB', $options: 'i'} ,pincodes: { $in : ['135001','134002']}}}})
获得输出
[
{
"_id" : "5d401d4aba592260507479d2",
"name" : "test agency",
"msisdn" : "99961110278",
"apps" : [
{
"pincodes" : [
"135001",
"122017"
],
"_id" : "5d401d4aba592260507479d3",
"name" : "DSB"
}
],
"__v" : 0
}
,
{
"_id" : "5d402249035f3063657240a9",
"name" : "test agency",
"msisdn" : "99961110278",
"apps" : [
{
"pincodes" : [
"135001",
"122017"
],
"_id" : "5d402249035f3063657240ab",
"name" : "DSB"
},
{
"pincodes" : [
"135001",
"122017"
],
"_id" : "5d402249035f3063657240aa",
"name" : "DBH"
}
],
"__v" : 0
}
,
{
"_id" : "5d402d36035f3063657240ac",
"name" : "test agency",
"msisdn" : "99961110278",
"apps" : [
{
"pincodes" : [
"135001",
"122018"
],
"_id" : "5d402d36035f3063657240ae",
"name" : "DSB"
},
{
"pincodes" : [
"135001",
"122017"
],
"_id" : "5d402d36035f3063657240ad",
"name" : "DBH"
}
],
"__v" : 0
}]
预期产出
[
{
"_id" : "5d401d4aba592260507479d2",
"name" : "test agency",
"msisdn" : "99961110278",
"apps" : [
{
"pincodes" : [
"135001",
"122017"
],
"_id" : "5d401d4aba592260507479d3",
"name" : "DSB"
}
],
"__v" : 0
}
,
{
"_id" : "5d402249035f3063657240a9",
"name" : "test agency",
"msisdn" : "99961110278",
"apps" : [
{
"pincodes" : [
"135001",
"122017"
],
"_id" : "5d402249035f3063657240ab",
"name" : "DSB"
}
],
"__v" : 0
}
,
{
"_id" : "5d402d36035f3063657240ac",
"name" : "test agency",
"msisdn" : "99961110278",
"apps" : [
{
"pincodes" : [
"135001",
"122018"
],
"_id" : "5d402d36035f3063657240ae",
"name" : "DSB"
}
],
"__v" : 0
}]
解决方案
您也可以通过$group
and以另一种方式进行操作$match
。
db.getCollection('test').aggregate([
{$match: {"apps.name": {$regex: 'DSB', $options: 'i'}}}, // Return only data which name is DSB
{$unwind: "$apps"}, // Convert array to object (To remove DTH data in same document)
{$match: {"apps.name": {$regex: 'DSB', $options: 'i'}, // Again filter with DSB and pincodes "apps.pincodes": { $in : ['135001','134002']}}},
{$group: { // Finall group it again. So we will have only DSB related data
_id: "$_id",
name: {$first: "$name"},
msisdn: {$first: "$msisdn"},
__v: {$first: "$__v"},
apps: {$push: "$apps"}
}}
])
推荐阅读
- javascript - 四舍五入到最接近的 0.5
- xcode - 安装 glog CocoaPod 时出错“配置:错误:C 预处理器“/lib/cpp”未通过完整性检查”
- angular - 当 projectId 作为环境变量发送时,Angular Firebase 不起作用
- java - 正则表达式查找方括号之间的所有引号
- javascript - 如何在 odoo [12.0] 中覆盖 action_registry js
- codeigniter - CODEIGNITER CI 如何读取模型名称,即使它不同
- sql - 从匹配案例的另一个表值更新 Oracle 表
- java - 如何在java中更改值new Date()
- python - 如何使用切片在多个数组中获取 2 个数字(numpy)
- jquery - Socket.io ID 问题,ID 错误