MongoDB :在符合多个条件的数组中查找具有 2 个值的文档
MongoDB : find documents having 2 values in Array conforming to multiple criteria
假设,我们有文档:
{_id : 1, arr : [5,50]}
{_id : 2, arr : [11,53]}
目标是找到数组中有 2 个值的文档,一个必须在范围 (4,9) 内,第二个在范围 (45,55) 内。
在这种情况下,只有 _id 的文档:1 应该 return.
试过这个:
db.Collection.find({arr : {$elemMatch : {$gte : 4, $lte : 9}}})
- returns 第一个文档
db.Collection.find({arr : {$elemMatch : {$gte : 45, $lte : 55}}})
- return两者都是
如何将这些标准组合在一起?
db.Collection.find({arr : {$and : [{$elemMatch : {$gte : 4, $lte : 9}}, {$elemMatch : {$gte : 45, $lte : 55}}]}})
returns : error: { "$err" : "invalid operator: $and", "code" : 10068 }
您的想法是对的,但是 $and
需要位于条件对象的顶层:
db.Collection.find({$and: [
{arr: {$elemMatch: {$gte: 4, $lte: 9}}},
{arr: {$elemMatch: {$gte: 45, $lte: 55}}}
]})
如果你还想确保这些是 只有 两个元素,那么你可以在 $and
数组中添加另一个项来检查:
db.Collection.find({$and: [
{arr: {$elemMatch: {$gte: 4, $lte: 9}}},
{arr: {$elemMatch: {$gte: 45, $lte: 55}}},
{'arr.2': {$exists: false}}
]})
假设,我们有文档:
{_id : 1, arr : [5,50]}
{_id : 2, arr : [11,53]}
目标是找到数组中有 2 个值的文档,一个必须在范围 (4,9) 内,第二个在范围 (45,55) 内。 在这种情况下,只有 _id 的文档:1 应该 return.
试过这个:
db.Collection.find({arr : {$elemMatch : {$gte : 4, $lte : 9}}})
- returns 第一个文档
db.Collection.find({arr : {$elemMatch : {$gte : 45, $lte : 55}}})
- return两者都是
如何将这些标准组合在一起?
db.Collection.find({arr : {$and : [{$elemMatch : {$gte : 4, $lte : 9}}, {$elemMatch : {$gte : 45, $lte : 55}}]}})
returns : error: { "$err" : "invalid operator: $and", "code" : 10068 }
您的想法是对的,但是 $and
需要位于条件对象的顶层:
db.Collection.find({$and: [
{arr: {$elemMatch: {$gte: 4, $lte: 9}}},
{arr: {$elemMatch: {$gte: 45, $lte: 55}}}
]})
如果你还想确保这些是 只有 两个元素,那么你可以在 $and
数组中添加另一个项来检查:
db.Collection.find({$and: [
{arr: {$elemMatch: {$gte: 4, $lte: 9}}},
{arr: {$elemMatch: {$gte: 45, $lte: 55}}},
{'arr.2': {$exists: false}}
]})