Недопустимый счет в MongoDB

Технология:

  • MongoDB 3.0.8 (MMAPv1), не оговоренный, выделенный кластер, размещенный на AWS через mLab (первичный, вторичный и арбитр), RAM 3.7GB
  • Драйвер С# для MongoDB 2.3
  • Строка подключения:

MongoDB://USER: [email protected]: 1234, MYMONGO2.com: 1234/DB_NAME replicaSet = REPLICA_SET_NAME

Предположения

  • У меня есть коллекция продуктов с одним из полей, называемых Package.
  • Есть индекс: "Пакет": 1
  • Объекты из этой коллекции никогда не удаляются.
  • Пакет полей никогда не обновляется.
  • Время от времени вставляются новые объекты.

Один раз в день я регистрирую конкретный счетчик в этой коллекции (одинаковые параметры каждый раз):

db.Products({"Package": "Box"}).count()
// actual code running in C#:
productsCollection.Find(p => p.Package == "Box").Count()

Я ожидаю, что результат будет таким же или большим с каждым днем. Но иногда я получаю меньшее значение. На следующий день он снова станет правильным. Он воспроизводится в двух разных средах.

Пример:

  • День 1: 4,563,135
  • День 2: 4,563,135
  • День 3: 4,563,124 (ровно на 11 меньше, чем ожидалось).
  • День 4: 4,563,135

Я пытался вручную воспроизвести его как через С#, так и непосредственно против Mongo, но не удалось (значение всегда было правильным).

Что происходит?

Ответ 1

Вероятно, это связано с тем, что при выполнении кода был выполнен балансировочный раунд. Из документации MongoDB:

В кластерном кластере db.collection.count() может привести к неточно рассчитывать, существуют ли сиротские документы или если миграция кусков Выполняется.

Подробнее об этом здесь: Документация MongoDB

Чтобы получить точный результат, следует использовать запросы структуры агрегации