查询 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"
  }
])

Playground

最适合此任务的似乎是 $elemMatch 运算符:

db.collection.find({
 a: {
  $elemMatch: {
    $gte: 12,
    $lte: 17
  }
 }
})

解释: 它将匹配所有文档,其中“a”数组元素中的至少一个值将同时匹配范围条件。

playground