如何在 collection 中过滤 mongoDB 中的查询
How to filter query in mongoDB in collection
我正在尝试在 mongoDB 中进行过滤,但没有得到预期的输出。我正在使用 $elemMatch
但仍然没有得到预期。
机构Collection
[
{
"_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
}]
您可能需要 $filter 才能执行此操作。
db.Agency.aggregate([
{
$project: {
apps: {
$filter: {
input: "$apps",
as: "app",
cond: {"$$app.name": {$regex: 'DSB', $options: 'i'} ,"$$app.pincodes": { $in : ['135001','134002']}}
}
}
}
}
])
您也可以通过 $group
和 $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"}
}}
])
如果数组中的任何元素符合条件,MongoDB 将 return 完整数组。如果您只需要匹配的元素,则需要对数据使用聚合。以下查询可以获得预期的输出:
db.agency.aggregate([
{
$unwind:"$apps"
},
{
$match:{
"apps.name":{
$regex: "DSB",
$options: 'i'
},
"apps.pincodes": {
$in : ['135001','134002']
}
}
},
{
$group:{
"_id":"$_id",
"name":{
$first:"$name"
},
"msisdn":{
$first:"$msisdn"
},
"apps":{
$push:"$apps"
},
"__v":{
$first:"$__v"
}
}
}
]).pretty()
- 第一阶段:打开数组并为每个数组元素创建单独的文档
- 第二阶段:申请条件
- 第三阶段:根据_id再次分组信息
我正在尝试在 mongoDB 中进行过滤,但没有得到预期的输出。我正在使用 $elemMatch
但仍然没有得到预期。
机构Collection
[
{
"_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
}]
您可能需要 $filter 才能执行此操作。
db.Agency.aggregate([
{
$project: {
apps: {
$filter: {
input: "$apps",
as: "app",
cond: {"$$app.name": {$regex: 'DSB', $options: 'i'} ,"$$app.pincodes": { $in : ['135001','134002']}}
}
}
}
}
])
您也可以通过 $group
和 $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"}
}}
])
MongoDB 将 return 完整数组。如果您只需要匹配的元素,则需要对数据使用聚合。以下查询可以获得预期的输出:
db.agency.aggregate([
{
$unwind:"$apps"
},
{
$match:{
"apps.name":{
$regex: "DSB",
$options: 'i'
},
"apps.pincodes": {
$in : ['135001','134002']
}
}
},
{
$group:{
"_id":"$_id",
"name":{
$first:"$name"
},
"msisdn":{
$first:"$msisdn"
},
"apps":{
$push:"$apps"
},
"__v":{
$first:"$__v"
}
}
}
]).pretty()
- 第一阶段:打开数组并为每个数组元素创建单独的文档
- 第二阶段:申请条件
- 第三阶段:根据_id再次分组信息