о _id и вложенных объектах - PullRequest
2 голосов
/ 09 ноября 2011

Буду признателен, если кто-нибудь ответит на мои вопросы о MongoDB для новичков.

  1. Какие будут последствия, если назначенное пользователем поле _id не будет уникальным в БД или коллекции?В какой области действительно нужна уникальность (и какова область для вложенных объектов)?

  2. Можно ли изменить (заменить) _id (и его тип) для целых документов вколлекция?

  3. В чем разница (при обработке с помощью механизма БД) между вложенными объектами, когда я храню только как объекты json (см. ниже - A) или как внедренные документы с _id (B)?

    A) {book: _id:.. chapters[{json object has not _id},{}]}

    B) {book: _id:.. chapters[{_id:... },{}]}

    Разница только в наличии _id и индексации или в чем-то более глубоком?

  4. Как я могу преобразовать "просто объекты json" (без _id) во встроенные документы с помощью _id?

1 Ответ

2 голосов
/ 09 ноября 2011

Какие будут последствия, если назначенное пользователем поле _id не будет уникальным в БД или коллекции? В какой сфере действительно нужна уникальность (и какова область для вложенных объектов)?

Уникальность слишком важна в любом наборе данных, потому что вам нужен способ идентифицировать ваши данные по некоторой идентичности. Уникальные идентификаторы являются ключевыми для этого.

И это действительно важно, когда вы определяете уникальные индексы. Он будет прикручен при попытке добавить дубликат ключа в уникальный индекс.

Можно ли изменить (заменить) _id (и его тип) для всего документы в коллекции?

Нет, это невозможно напрямую, вам нужно скопировать данные документа во временную коллекцию и повторно вставить их в исходную коллекцию с новыми идентификаторами.

в чем разница (при обработке с помощью механизма БД) между вложенными объекты, когда я храню как объекты JSON (см. ниже - A) или как встроенные документы с _id (B)?

Встроенные объекты - это те, которые изначально поддерживаются mongodb, ссылки на объекты будут обрабатываться вручную вашим кодом, в основном ODM (например, ruby ​​Mongoid)

Поскольку вы задали вопрос о разнице, встроенные документы обрабатываются как другое поле в документе, поэтому вы можете запросить его, вы можете проиндексировать его и будут возвращены как часть документа.

Но ссылочные документы - это совершенно отдельный документ. Вы не можете напрямую запросить его из родительского документа и индексации. Вместо этого вы должны написать логику приложения для хранения идентификаторов и вручную запросить их из приложения.

Как я могу конвертировать "просто объекты json" (без _id) во встроенные документы с _id?

Ваше предположение неверно. Вложенные документы имеют идентификаторы. Он будет создан автоматически при его создании.

EDIT:

Мои предположения были неверны в этом. Mongodb не генерирует автоматически идентификаторы для встроенных документов. Но некоторые ODM, такие как Mongoid, также генерируют идентификаторы для встроенных документов.

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