Мангуст соединяет данные - PullRequest
4 голосов
/ 17 июля 2011

Если у меня есть объект в моей MongoDB, который нужно будет использовать ВСЕГДА в моей системе, значит, он находится в своей собственной коллекции. Однако я не совсем понимаю, как заставить данные автоматически отображаться на других объектах, к которым они присоединяются.
Вот пример:

Schema1 = { name: String }  
Schema2 = { something: String, other_thing: [{schema1_id: String}] }

Теперь я хочу сказать var name = mySchema2.name; и получить имя связанного Schema1 объекта.
Я использую Mongoose, Express и Node.js, и я попытался использовать для этого Mongoose «virtual», но когда я говорю res.send(myobject);, я не вижу виртуального свойства в объекте.

Каков наилучший способ сделать это?

Ответы [ 3 ]

3 голосов
/ 17 января 2013

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

var postSchema = new Schema({
  author : {type : String}, 
  title : {type : String, required : true},
  content : {type : String, required : true},
  comment : {
    owner : {type : String},
    subject : {type: String, required : true},
    content : {type String, required : true}
  }
});

MongoDB позволяет вам простой и удобный способ запроса полей комментариев с помощью символа точки. Например, если мы хотим запрашивать только комментарии, тема которых начинается с 'car', мы делаем следующее:

myPostModel.find({ 'comment.subject' : /car*/ }).exec(function(err, result){
    Do some stuff with the result...
});

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

1 голос
/ 17 июля 2011

В Mongoose есть несколько плагинов, которые помогут с DBRefs.

mongoose-dbref использует стандарты DBRef и, вероятно, является хорошим началом для начала.

mongoose-plugins - это тот, который я написал недавно, но он работает немного по-другому.

0 голосов
/ 17 июля 2011

В mongodb нет такого слова, как JOIN , потому что объединения убивают масштабируемость.Но большинство драйверов поддерживают DBRef, они просто делают дополнительный запрос для загрузки ссылочных данных.Таким образом, вы можете просто сделать дополнительный запрос на загрузку объекта, который вы используете везде.

Если вы используете какой-либо объект повсюду в вашем приложении, это звучит как объект, который должен находиться в кеше.Но mongodb работает как своего рода кеш, если достаточно памяти для загрузки объекта в память.Итак, для простоты просто сделайте дополнительный запрос на загрузку объекта.

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