如果数组中至少有一个值在一个范围内,例如8到10,我如何查询所有文档。
如果我以枚举的形式查询它,它将按需要工作:{x : {$in: [8, 9, 10]}}。这将返回x中任何值位于集合8、9、10中的所有记录。在下面的示例中,它返回第一个记录,但不返回第二个记录。
但是在我的应用程序中,我不能枚举集合,因为范围可能非常大,甚至不一定是整数。
我最初的猜测是{ x: {$gte: 8, $lte: 10}},但这失败了,因为文档可能至少有一个值高于下限,至少有一个值在上界以下,因此即使没有值在下限和上限下面,也会传递。在下面的示例中,将返回两个记录,尽管记录2在8-10中没有值:
[
{
"key": 1,
"x": [ 5,9,10 ]
},
{
"key": 2,
"x": [ 2, 3, 7, 999 ]
}
]MongoPlayground上的示例:https://mongoplayground.net/p/2ZLfTcGnW4g
发布于 2022-05-19 19:08:58
最适合此任务的似乎是$elemMatch操作符:
db.collection.find({
a: {
$elemMatch: {
$gte: 12,
$lte: 17
}
}
})解释:它将匹配所有文档,其中至少有一个来自"a“数组元素的值将同时匹配范围条件。
发布于 2022-05-19 18:50:29
您可以使用聚合管道到$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"
}
])https://stackoverflow.com/questions/72309587
复制相似问题