2013-08-26 6 views
1

Привет i'm полностью новичку с MongoDB, я пришел с SQL Server, у меня есть следующие сомнения Если иметь структуру ниже:Создание запросов в MongoDB

Коллекция: телевизор

"_id": ObjectId("123456abc"), 
"brand": "Sony", 
"model": "Bravia", 
"price": 1000 

Коллекция : tvcomments

"_id": "_id": ObjectId("456789def"), 
"tv": ObjectId("123456abc"), 
"comments": [ 
     { 
      "user": ObjectId("413212eop"), 
      "text": "Very nice TV" 
     } 
] 

Я бы хотел, чтобы получить телевизор со своими комментариями, но я не найти пример, чтобы сделать это, возможно, не представляется возможным?

+1

'db.tvcomments.find ({тв: object_id_of_tv_document})'? – Sammaye

+0

Всегда можно создать другое поле в телевизионной коллекции под названием «комментарии», а затем просто вытащить информацию оттуда. В противном случае обратитесь к фрагменту @Sammaye – tymeJV

+0

Вы можете получать только документы из одной коллекции за раз. Поэтому вы не можете получить их обоих в одном запросе без реструктуризации ваших документов или коллекций. – WiredPrairie

ответ

3

Одно отличие между MongoDB и SQL заключается в том, что в MongoDB нет JOIN s. Предпочтительным способом моделирования данных в MongoDB является встраивание документов внутри друг друга, а не их разделение и ссылка на них ObjectId.

Ваш текущий способ выполнения действий потребует двух поездок в базу данных, один для получения телевизора и один для получения комментариев. Если вы не планируете ссылаться на комментарии в месте, где вы не будете ссылаться на телевизор (маловероятно), вы можете просто поместить комментарии в телевизионный документ напрямую. Теперь вы получаете комментарии «бесплатно», когда вы тянете телевизионные документы.

{ 
    "_id": ObjectId("123456abc"), 
    "brand": "Sony", 
    "model": "Bravia", 
    "price": 1000, 
    "comments": [ 
      { 
       "user": ObjectId("413212eop"), 
       "text": "Very nice TV" 
      } 
    ] 
} 

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

Смотрите здесь для получения дополнительной информации: http://docs.mongodb.org/manual/core/data-modeling/

+0

Я читал документы mongodb, в бетоне о ручной ссылке, и он говорит следующее: Ручные ссылки относятся к практике включения одного поля _id в другой документ. Затем приложение может выдавать второй запрос для разрешения указанных полей. Я не понимаю цель этой ссылки или DBRef, она только показывает мне ссылку, но она не приносит мне информацию, которая мне нужна. Мне нужно иметь телевизор в одной коллекции и пользователей в другой коллекции, я не могу вставлять информацию пользователя (имя, изображение ...) в коллекцию телевизора. – RMontes13

+1

Возможно, MongoDB не подходит для вас, если у вас есть реляционные данные. В этом случае вашему приложению потребуется запросить объект TV, затем получить список пользователей, которые прокомментировали, а затем сделать второй запрос для этих пользователей. Невозможно вернуть все эти данные в один запрос. – Mason