首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询MongoDB,其中至少有一个数组的值在一个范围内

查询MongoDB,其中至少有一个数组的值在一个范围内
EN

Stack Overflow用户
提问于 2022-05-19 18:39:16
回答 2查看 93关注 0票数 -1

如果数组中至少有一个值在一个范围内,例如8到10,我如何查询所有文档。

如果我以枚举的形式查询它,它将按需要工作:{x : {$in: [8, 9, 10]}}。这将返回x中任何值位于集合8、9、10中的所有记录。在下面的示例中,它返回第一个记录,但不返回第二个记录。

但是在我的应用程序中,我不能枚举集合,因为范围可能非常大,甚至不一定是整数。

我最初的猜测是{ x: {$gte: 8, $lte: 10}},但这失败了,因为文档可能至少有一个值高于下限,至少有一个值在上界以下,因此即使没有值在下限和上限下面,也会传递。在下面的示例中,将返回两个记录,尽管记录2在8-10中没有值:

代码语言:javascript
复制
[
  {
    "key": 1,
    "x": [ 5,9,10 ]
  },
  {
    "key": 2,
    "x": [ 2, 3, 7, 999 ]
  }
]

MongoPlayground上的示例:https://mongoplayground.net/p/2ZLfTcGnW4g

如何在mongodb中查找范围之间的值

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-19 19:08:58

最适合此任务的似乎是$elemMatch操作符:

代码语言:javascript
复制
db.collection.find({
 a: {
  $elemMatch: {
    $gte: 12,
    $lte: 17
  }
 }
})

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

游乐场

票数 3
EN

Stack Overflow用户

发布于 2022-05-19 18:50:29

您可以使用聚合管道到$filter只匹配项,作为匹配文档的条件:

代码语言:javascript
复制
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"
  }
])

游乐场

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72309587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档