MongoDB 集合作为具有值范围的查找表

Posted

技术标签:

【中文标题】MongoDB 集合作为具有值范围的查找表【英文标题】:MongoDB collection as a lookup table with range of values 【发布时间】:2020-06-20 16:50:01 【问题描述】:

我有一个有趣的场景,但我找不到干净的解决方案。

假设我有一家巧克力工厂,它根据生产的巧克力棒的数量获得等级 [A-Z] 分数。 Grades 到 numChocolateBars 的映射存储在一个集合中,如下所示:

Grade, numChocolateBars, neededChocolateForNextGrade
Z, 0, 100
Y, 100, 150
X, 250, 1100
...
B, 11805606, 1228825
A, 13034431,

例子:

99 numChocolateBars 将获得 Z 级。 100 numChocolateBars 的评分为 Y。 150 numChocolateBars 的评分为 Y。 99999999999999999 numChocolateBars 将获得 A 级。

使用 Mongoose 或 MongoDB 查询,为给定的 numChocolateBars 找到合适等级的最佳方法是什么?

我目前的解决方案

我已经设法使用:

GradeMap.findOne(
  
    numChocolateBars:  $gt: thisMonthsNumChocolate
  
).Grade-1;

这基本上找到了 numChocolateBars > thisMonthsNumChocolate 的第一条记录(比我想要的高一个等级)并从中减去一个。只要我有一个 numChocolteBars 高于任何可能值的最终虚拟记录,这就会起作用。但这似乎非常不稳定,它依赖于 Mongo 搜索数据的顺序。我担心这个顺序可能会根据索引或其他因素而改变。有没有更好的办法?

【问题讨论】:

您可以运行.find 并解释排序/限制here 我已经发布了示例数据。上面的csv是数据集。每行是一个特定的成绩分数。它包含一个等级字母,以及达到该等级分数所需的 numChocolateBars。 requiredChocolateForNextGrade 只是额外的数据,它显示下一个年级还有多少巧克力棒。 【参考方案1】:

您可以尝试以下查询:

db.collection.find(
  numChocolateBars: 
    $lte: thisMonthsNumChocolate
  ,
  neededChocolateForNextGrade: 
    $gt: thisMonthsNumChocolate
  
)

测试: MongoDB-Playground

编辑:

由于 neededChocolateForNextGrade 不是一个固定值 & 如果它取决于 numChocolateBars

db.collection.find(
  numChocolateBars: 
    $lte: 149
  ,
  $expr: 
    $gt: [
      
        $sum: [
          "$numChocolateBars",
          "$neededChocolateForNextGrade"
        ]
      ,
      149
    ]
  
)

测试: MongoDB-Playground

【讨论】:

只是添加到答案中,needChocForNextGrade 是当前等级到下一个等级的增量,因此实际的最终查询是聚合查询: db.collection.find( numChocolateBars: $lte: 150 , $expr: $gt: [ $sum: [ "$numChocolateBars", "$neededChocolateForNextGrade" ] , 150 ] ) 既然你的回答让我朝着正确的方向开始,你介绍了我感谢 mongoDB-Playground 的美丽,我会将其标记为正确,但请将查询更改为正确的,再次感谢 @user2896438 :哦,好吧,我认为 neededChocolateForNextGrade 是固定的!我看到这取决于 numChocolateBars !无论如何,这个概念仍然相似,将更新它以供将来参考!

以上是关于MongoDB 集合作为具有值范围的查找表的主要内容,如果未能解决你的问题,请参考以下文章

具有 3 个级别的 MongoDB 嵌套查找

具有 3 个级别的 MongoDB 嵌套查找并将新值附加到结果文档

常见问题:MongoDB基础知识

MongoDB Pymongo 问题

在 mongodb 地理位置查询中使用对象属性作为 $maxDistance 参数

MongoDB索引管理