Есть ли причина для проверки узла-mongodb-native при вставке документов с дубликатами _id? - PullRequest
0 голосов
/ 14 августа 2011

Я пишу код, используя node-mongodb-драйвер непосредственно в nodeJS.Я настроил коллекцию в своей базе данных, которая использует мое собственное пространство _id, где каждый уникальный документ гарантированно имеет уникальный _id.Тем не менее, при добавлении элементов в базу данных существует высокая вероятность, что один и тот же элемент будет вставлен в коллекцию более одного раза, что означает попытку использовать один и тот же _id более одного раза.

Что я делаю сейчас, чтобы избежать каких-либо проблем, это позвонить collection.findOne(_id:ID) перед вставкой, чтобы убедиться, что я не пытаюсь вставить документы, которые уже есть в коллекции.Однако, так как я добавляю много документов за раз, и это должно быть асинхронно, я сохраняю большое количество переменных, чтобы при вызове findOne() вызывать правильную переменную (если применимо)).

Однако я понял, что могу покончить с сохранением переменных, если просто не удосужился проверить, существует ли уже документ, и просто пошел дальше и вставил их.Если в коллекции уже есть документ с таким же _id, я просто получу сообщение об ошибке, говорящее, что _id уже существует, и код продолжит работать.Подобное кодирование уменьшит время работы моего программного обеспечения (меньше вызывается функций) и пространство в ОЗУ, которое оно занимает (гораздо меньше переменных сохраняется).

Однако я хотел посмотреть, не подумал ли кто-нибудь, что есть какая-то причина не делать этого.Когда такая функция, как insert() возвращает ошибку, происходит ли что-то плохое или может произойти, чего я не знаю?

Лучше всего, и спасибо,
Сами

1 Ответ

1 голос
/ 16 августа 2011

Итак, ваша основная идея верна, вы правы, что findOne() не решает проблему параллелизма.Но есть некоторые морщины.

Есть ли что-то плохое, что происходит или может случиться, что я, возможно, не осознаю?

Первая проблема заключается в том, что insert не можетбыть неудачным из-за повторяющейся ошибки.Может быть, это сбой, потому что БД не работает или что-то еще.Поэтому убедитесь, что вы проверяете причину ошибки и обрабатываете ее соответствующим образом.

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

Вторая проблема связана с данными вставки.

Если сервер 1 генерирует insert, а сервер 2 генерирует insert для одного и того же документа, они генерируют один и тот же оператор insert?

  • Если ответ да , то вы, вероятно, поступаете правильно.
  • Если ответ нет , тогдаВы можете посмотреть на команду upsert .Это работает не во всех случаях, но может работать и для вас.
  • Кроме того, есть также команда findAndModify .Вместо выдачи исключений вы можете вернуть измененный объект.Это имеет большую кривую обучения, но это может быть лучшим вариантом .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...