查询 MongoDB 其中数组的至少一个值在范围内
Query MongoDB where at least one value of an array is inside a range
我如何查询 MongoDB 以查找数组中至少有一个值落在某个范围内的所有文档,例如8 到 10。
如果我将其作为枚举进行查询,这将按需要工作:{x : {$in: [8, 9, 10]}}
。这将 return 所有 x
中的任何值都在集合 [8,9,10] 中的记录。在下面的示例中,它 return 是第一条记录而不是第二条记录。
但在我的应用程序中,我无法枚举集合,因为范围可能非常大,甚至不一定是整数。
我的第一个猜测是 { x: {$gte: 8, $lte: 10}}
但这失败了,因为文档可能至少有一个值高于下限,至少有一个值低于上限,因此即使没有值也会通过既高于下层又低于上层。
在下面的示例中,两条记录都被 returned,即使记录 2 在 8–10 中没有值:
[
{
"key": 1,
"x": [ 5,9,10 ]
},
{
"key": 2,
"x": [ 2, 3, 7, 999 ]
}
]
MongoPlayground 上的示例:https://mongoplayground.net/p/2ZLfTcGnW4g
您可以使用聚合管道 $filter 仅匹配项目作为匹配文档的条件:
db.collection.aggregate([
{
$addFields: {
valid: {
$size: {
$filter: {
input: "$x",
as: "item",
cond: {$and: [{$gte: ["$$item", rangeMin]}, {$lte: ["$$item", rangeMax]}]}
}
}
}
}
},
{
$match: {valid: {$gt: 0}}
},
{
$unset: "valid"
}
])
最适合此任务的似乎是 $elemMatch 运算符:
db.collection.find({
a: {
$elemMatch: {
$gte: 12,
$lte: 17
}
}
})
解释:
它将匹配所有文档,其中“a”数组元素中的至少一个值将同时匹配范围条件。
我如何查询 MongoDB 以查找数组中至少有一个值落在某个范围内的所有文档,例如8 到 10。
如果我将其作为枚举进行查询,这将按需要工作:{x : {$in: [8, 9, 10]}}
。这将 return 所有 x
中的任何值都在集合 [8,9,10] 中的记录。在下面的示例中,它 return 是第一条记录而不是第二条记录。
但在我的应用程序中,我无法枚举集合,因为范围可能非常大,甚至不一定是整数。
我的第一个猜测是 { x: {$gte: 8, $lte: 10}}
但这失败了,因为文档可能至少有一个值高于下限,至少有一个值低于上限,因此即使没有值也会通过既高于下层又低于上层。
在下面的示例中,两条记录都被 returned,即使记录 2 在 8–10 中没有值:
[
{
"key": 1,
"x": [ 5,9,10 ]
},
{
"key": 2,
"x": [ 2, 3, 7, 999 ]
}
]
MongoPlayground 上的示例:https://mongoplayground.net/p/2ZLfTcGnW4g
您可以使用聚合管道 $filter 仅匹配项目作为匹配文档的条件:
db.collection.aggregate([
{
$addFields: {
valid: {
$size: {
$filter: {
input: "$x",
as: "item",
cond: {$and: [{$gte: ["$$item", rangeMin]}, {$lte: ["$$item", rangeMax]}]}
}
}
}
}
},
{
$match: {valid: {$gt: 0}}
},
{
$unset: "valid"
}
])
最适合此任务的似乎是 $elemMatch 运算符:
db.collection.find({
a: {
$elemMatch: {
$gte: 12,
$lte: 17
}
}
})
解释: 它将匹配所有文档,其中“a”数组元素中的至少一个值将同时匹配范围条件。