Монго связи / ссылки: наиболее эффективный способ? Примеры?
Я пытаюсь понять, как связать / ссылаться на документ на другой документ, но я не нахожу много информации или примеров в документах или других источниках. При связывании документов мне нужно связать ObjectID или я могу использовать любое поле? Нужно ли мне извлекать значение поля непосредственно из исходного документа или я могу передать одно значение из любого места? Например, учитывая шестую строку объекта UUID, я хочу связать 2 документа через поле «GUID», которое содержит объект uuid1:
# What is more efficience/the correct way, option 1 or 2? # Option 1 hexString = '5d78ad35ea5f11e1a183705681b29c47' newLinkField = { 'linkToSong' : uuid.UUID( hexString ) } db.artists.update( { 'name' : 'Bob Dylan' }, { $set : newLinkField }, upsert = False) # Option 2 hexString = '5d78ad35ea5f11e1a183705681b29c47' songGUID = db.songs.find_one({ 'GUID' : uuid.UUID( hexString ) }, {'GUID': 1 }); newLinkField = { 'linkToSong' : songGUID } db.artists.update( { 'name' : 'Bob Dylan' }, { $set : newLinkField }, upsert = False)
Кроме того, это сохранение фактических ссылок или просто дубликатов объекта UUID?
- Что вызывает «неспособность подключиться к источнику данных» для pyodbc?
- Почему я получаю эту ошибку в монгольском запросе?
- Как обновить Mongo-документ после его вставки?
- Как преобразовать int в базу 9, без 0?
- Структура данных для базы данных текстовых материалов
Я очень рекомендую это видео 10gen для понимания ссылок и вложений, их использования и компромиссов:
http://www.10gen.com/presentations/mongosv-2011/schema-design-principles-and-practice
Чтобы ответить на ваши вопросы: «связывание» документа A с документом B просто означает предоставление некоторой информации в A, которая позволяет вашему приложению запрашивать B. Обычно это было бы примерно так:
// Document A, in collection 'comments': { _id: ObjectId('123...'), user: ObjectId('abc...'), text: 'Hi!' } // Document B, in collection 'users': { _id: ObjectId('abc...'), name: 'Jesse' }
Документ A, мой комментарий, связан с B, моим профилем пользователя. Ваше приложение может запросить A, но он хочет (через _id, по пользователю, по тексту, …), а затем изучить его поле «пользователь», а затем найти мой профиль пользователя, запросив коллекцию пользователей для этого объекта ObjectId.
Поле, которое вы используете для связи A с B, должно быть, должно быть уникальным в коллекции B, и оно обязательно должно быть проиндексировано в коллекции B.
Оба требования всегда удовлетворяются полем _id любой коллекции, но они могут быть удовлетворены и другим полем.
Ваш пример 1 в порядке. Хотя вы, вероятно, имеете его в обратном направлении: в песнях должны присутствовать художники, а не наоборот, если только Боб Дилан не написал одну песню.
В примере 2 нет необходимости и стоить найти песню перед художником, если вы уже знаете, как вы собираетесь запрашивать документ художника.
Mongoengine может делать ссылки между моделями только из коробки. Но это действительно плохо, что вы делаете с документально-ориентированной базой данных. Поскольку вы можете получить проблемы с масштабированием базы данных и решает на основе ссылок, уменьшите производительность dbs noSQL. Не стесняйтесь писать все данные, что вам нужно в одной записи, например, если вам нужно создать запись для песни, вы можете сделать это следующим образом:
{'title': 'Black and white', 'singer': 'M Jackson', 'album': 'Some album' and etc}
dont страшные данные накладные, объектно-ориентированная БД, в первую очередь предназначенная для этих вещей.
- Импорт страниц с помощью Python, PyQt, Qt Designer и QStackedWidget
- Как нормализовать чрезвычайно большое количество для логистической регрессии?
- MongoDB: Почему update () возвращает значение null даже в случае успеха?
- Обновление Pymongo: возможно ли вставить поле с '$ currentDate' только один раз?
- Pymongo $ addToSet не работает
- Это занимает много времени … как ускорить этот словарь? (Python)
- Django и разработка приложения с занятиями в тренажерном зале
- Python: недопустимый буквенный индекс для базы данных Int () 10
- MongoDB Оптимизация FindAndModify или Найти + Сортировать
- SqlAlchemy IntegrityError
- Очистка вложенных операторов re.sub