У меня есть база данных mongodb с 10-15 миллионами записей. Для каждого из них я должен обновить поле, которое изначально не существует. Предполагая, что приложение потерпело крах из-за неожиданного завершения работы сервера, как лучше всего обновлять оставшиеся записи?
Должен ли я использовать field: {$exists: false}
и обновлять их, или я должен пройти через всю коллекцию и проверять каждый документ, если он имеет это поле, или нет, и если да, выполните обновление? Я беру на себя это потому, что, поскольку вы не можете связать индекс с существованием поля, $ существует, в основном то же самое. Какой из них будет быстрее и почему?
Обратите внимание, что значение, которое это поле будет иметь, зависит от других полей документа, поэтому я не могу выполнить обновление с несколькими: истинными.
Решение: Как @DhruvPathak и @Sammaye предполагают, в то время как показатели, связанные с данными, а не сами поля (так что вы не можете иметь индекс связан с существованием поля), $ существуют могут воспользоваться индексов на документах, где существуют поля, и это значительно увеличивает скорость.
Дополнительная информация: Хотя это немного побочный квест, теперь я знаю причину, по которой приложение разбилось. Сервер вычеркнул курсор, потому что он использовался слишком долго (учитывая размер коллекции). Этого можно избежать, используя batch_size
, как описано here.
[пояснить()] (http://docs.mongodb.org/manual/reference/method/cursor.explain/) может помочь – soulcheck
Вы можете добавить поле "field_exists" в свои документы, по умолчанию значение false. Если вы обновите документ, вы установите для параметра «field_exists» значение true. И вы можете легко создать индекс над этим полем. – thomas
@soulcheck Правда, объяснение поможет с запросом $ exist, но в другом случае, когда я обновляю каждое поле вручную, объясните, что не могу дать мне данные о том, насколько эффективен мой цикл при обновлении каждого документа. Это скрипт pymongo. – thehousedude