Коллекция MongoDB как справочная таблица с диапазоном значений - PullRequest
1 голос
/ 08 марта 2020

У меня есть интересный сценарий, для которого я не могу найти чистое решение.

Предположим, у меня есть шоколадная фабрика, которая получает оценку степени [AZ] на основе того, сколько шоколадных плиток она производит. Отображение Grades to 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.

Используя Mon goose или запрос MongoDB, каков наилучший способ найти подходящую оценку для данного numChocolateBars?

Мое текущее решение

Мне удалось заставить работать вещи, используя:

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

Который по существу находит первую запись с numChocolateBars> thisMonthsNumChocolate (на одну ступень выше, чем я хочу) и вычитает одну из нее. Это работает до тех пор, пока у меня есть окончательная фиктивная запись с numChocolteBars, превышающим любое возможное значение. Но это кажется очень нестабильным и зависит от порядка, в котором Mon go просматривает данные. Я беспокоюсь ie этот порядок может измениться в зависимости от индексации или других факторов. Есть ли лучший способ?

1 Ответ

1 голос
/ 08 марта 2020

Вы можете попробовать запрос ниже:

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

Тест: MongoDB-Playground

Редактировать:

Как requiredChocolateForNextGrade не является фиксированным значением, и если оно зависит от numChocolateBars :

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

Тест: MongoDB-площадка

...