Достаточно уникальный идентификатор MongoDb - Безопасно ли использовать $ pop для удаления элементов массива в mongo db? - PullRequest
0 голосов
/ 10 июня 2011

Меня беспокоит использование $ pop для удаления элементов массива (внедренного документа) в mongodb по двум основным причинам:

  1. Я не знаю, является ли порядок массива статическим,Возможно ли возвращение / сохранение массива в другом порядке?
  2. Что, если другой пользователь удалит индекс со значением меньше или равно перед тем, как удалить мой?Это может привести к удалению неверных данных.

Я знаю, что могу использовать $ pull, но проблема в том, что мне, возможно, придется использовать весь встроенный объект для criterea, я хочубыть в состоянии использовать некоторый вид идентификатора «достаточно уникален» (это может быть совсем другой вопрос) для использования при работе с внедренными объектами, и его положение в массиве представляется логичным выбором.

Если это действительно «небезопасно»чтобы использовать $ pop, я подумал о двух возможных решениях для «достаточно уникального» идентификатора.

  1. Добавить новый экземпляр MongoId к каждому встроенному объекту во время вставки.Проблема с этим теперь заключается в том, что функция $ set не вставляет дублирующую запись.Вам нужно будет проверить наличие дубликатов перед вставкой.
  2. json_encode новой записи, затем md5 хэширует эту строку json.Это может быть лучшим решением, поскольку оно гарантирует, что идентификатор уникален для этой записи, но если вы попытаетесь вставить ту же запись, она действительно останется такой же, поэтому $ set проигнорирует ее.

Итак, я думаю, что мой вопрос состоит из двух частей: безопасно ли использовать $ pop при удалении элементов из массива.Если нет, то как лучше всего добавлять достаточно уникальные идентификаторы во встроенные документы?

(может иметь значение, а может и не иметь значения, что я использую PHP)

1 Ответ

1 голос
/ 10 июня 2011

Для 1 порядок массива не изменится, если вы правильно им манипулируете.

Для 2 вы можете использовать стратегию «Обновить, если текущая» (оптимистическая блокировка): http://www.mongodb.org/display/DOCS/Atomic+Operations#AtomicOperations-%22UpdateifCurrent%22 Добавить поле версии к вашему документу, которое вы будете увеличивать при каждой модификации (Doctrine MongoDB ODM может сделать это за вас ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...