2015-07-27 2 views
1

Я хочу использовать MongoosePopulation и получать информацию из других коллекций. Мои модели:Как работает население мангуста

var mongoose = require('mongoose'); 
var Users = require('../users'); 
var schema = new mongoose.Schema({ 
    book_name: String, 
    book_publisher: String 
}); 
var book = mongoose.model('book', schema); 
module.exports = book; 

И

var mongoose = require('mongoose'); 
var Book = require('../book'); 
var Schema = mongoose.Schema; 
var schema = new mongoose.Schema({ 
    user_name: String, 
    books: [{ type: Schema.Types.ObjectId, ref: 'Book' }] 
}); 
var users = mongoose.model('users', schema); 
module.exports = users; 

Я хочу, чтобы хранить каждый пользователь книг внутри books field и заселить их от Books collection. Но я не могу понять, как это происходит? Как моя схема Users подключается к схеме Book? Я имею в виду, что поле _id внутри схемы книги должно совпадать с _id в схеме пользователей? Я не указывал никакого отношения, которое я думаю, но в каждом учебнике, которое я читал, все они похожи на это. Я хочу, чтобы каждый пользователь книги отдельно, но что является ключевым элементом для сравнения в двух коллекциях? Я что-то делаю в методе поиска? это моя находка:

Users.find({book_name:name).populate('books').exec(
     function(err, users) { 
      if (err) { 
       throw err; 
      } 
      var new_user = users; 
     } 
); 

на самом деле мой вопрос, как это .populate('books') работы. Я никогда не говорю, какое поле в схеме книг связано с схемой пользователей. Я смущен.

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

ответ

2

Функция заполнения используется так: вы указываете в схеме, что поле (в данном случае это книги) является ObjectId, а ref является моделью «Книга», когда вы заполняете, mongoose отправляется в коллекцию книг и ищет для модели с идентификатором книги, указанной вами в User, поэтому он преобразует поле в поле Book вместо ObjectId.

Чтобы узнать, почему ваш код не работает, мне также нужно знать, как вы создаете объекты, но с быстрым взглядом я думаю, что это может быть причиной, потому что вы указываете название модели как «книгу» и используете ее в ref 'Book', я считаю, что мангуста чувствительна к регистру.

+0

тогда _id's в схеме книги может быть дубликат? потому что я хочу, чтобы пользователь мог иметь более одной книги! – Fcoder

1

_id в вашей коллекции книг должен быть уникальным (без дубликатов). И в вашем массиве книг на схеме пользователя вы должны хранить книги _id's. Мангуст будет использовать эти _ids для населения.

+0

, но как он может отличить, какая книга принадлежит определенному пользователю? – Fcoder

+0

Если я правильно понимаю, у одного пользователя может быть много книг, и одна книга может принадлежать нескольким пользователям, не так ли? Так что это отношения «многие ко многим». Существует несколько способов моделирования отношений «многие-ко-многим» с MongoDB. Вы должны выбирать на основе того, какие типы запросов вы будете делать. Я рекомендую вам прочитать следующее: http://blog.markstarkman.com/blog/2011/09/15/mongodb-many-to-many-relationship-data-modeling/ –

+0

Извините неправильную ссылку. Я обновил его. –

Смежные вопросы