【问题标题】:MongoDB collection as a lookup table with range of valuesMongoDB 集合作为具有值范围的查找表
【发布时间】: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 只是额外的数据,它显示下一个年级还有多少巧克力棒。

标签: mongodb mongoose mongodb-query


【解决方案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 !无论如何,这个概念仍然相似,将更新它以供将来参考!
猜你喜欢
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多