Mongodb возвращает неправильный счет - PullRequest
0 голосов
/ 15 февраля 2020

Я передавал данные из файла данных размером в несколько ГБ и импортировал их в коллекцию Mon go. Файл был заархивирован, поэтому я zcat file.gz | mongoimport знаю, что в коллекции должно быть 454229 документов. Это было пусто, и файл имеет 454229 записей. После процесса я попробовал подсчет и получил 459680. Я опустошил коллекцию и повторил процесс. Тот же результат. Затем я попробовал отличное в столбце «_id», попробовал длину и получил 454229. Чтобы удостовериться, что никакой другой процесс не изменял данные, я попробовал считать и различить дважды, различая с последующим подсчетом и затем подсчетом с последующим отличным.

rs1:PRIMARY> db.amazon_xml_data.distinct("_id").length;
454229
rs1:PRIMARY> db.amazon_xml_data.count({});
459680
rs1:PRIMARY> db.amazon_xml_data.count({});
459680
rs1:PRIMARY> db.amazon_xml_data.distinct("_id").length;
454229

Пн go версия 3.2.22. У меня тоже есть этот текст в конце файла журнала ...

amazon_xml_data 1.11GB
2020-02-15T14:37:07.302+0530    imported 454229 documents    

Так что я почти уверен, что число, возвращаемое счетчиком, неверно.

1 Ответ

0 голосов
/ 15 февраля 2020

В 2 случаях count может быть неточным:

После нечистого отключения монгода с использованием механизма хранения Wired Tiger статистика подсчета, представленная подсчетом, может быть неточной. Запустите validate для каждой коллекции на mongod, чтобы восстановить правильную статистику после нечистого отключения.

https://docs.mongodb.com/v3.2/reference/command/count/#accuracy -после-неожиданного-выключения

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

https://docs.mongodb.com/v3.2/reference/method/db.collection.count/#sharded -кластеры

Использовать лучше:

db.amazon_xml_data.aggregate(
   [
      { $group: { _id: null, count: { $sum: 1 } } }
   ]
)
...