2014-01-25 3 views
0

В настоящее время я пытаюсь разработать приложение, использующее mongo и node.js.Mongoose populate return undefined

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

Вот мои Schemas:

// Schema used by mongoose 
var userSchema = new mongoose.Schema(
{ 
    _id:  mongoose.Schema.Types.ObjectId, 
    login:  String, 
    password: String, 
    movies:  [ { type: mongoose.Schema.Types.ObjectId, ref: movieModel} ], 
    admin:  Boolean 
},{ collection: "user" }); 

var movieSchema = new mongoose.Schema(
{ 
    _id:   mongoose.Schema.Types.ObjectId, 
    title:   String, 
}, { collection: "movie" }); 

Как вы можете видеть, каждый пользователь имеет множество фильмов, этот массив содержит действительные идентификаторы фильмов. Я хочу, чтобы фильмы были пользователями. Это, как я строю мой запрос:

var query = userModel.findOne({ login: req.session.user["login"] }) 
         .populate("movies"); 

query.exec(function(err, user) 
{ 
    if (err) 
     throw err; 

    console.log(user.movies[0].title); 
}); 

запрос выполняется успешно, но при попытке отобразить название первого фильма на console.log линии я получил ошибку «TypeError: Не удается прочитать свойство" title 'of undefined ". Я проверил документацию о мангусте и не понимаю, почему я получаю эту ошибку.

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

Mongoose: user.findOne({ login: 'user' }) { fields: undefined } 
Mongoose: user.find({ _id: { '$in': [ ObjectId("52e2a28949ad409834473e71"), ObjectId("52e2a28949ad409834473e79") ] } }) { fields: undefined } 

Два иды на второй линии являются допустимыми идентификаторами фильмов. Я хотел бы показать их имя.

Большое спасибо за помощь.

ответ

1

Что это собой: ref: movieModel?

movieModel необходимо установить на строку, такую ​​как "Movie". См. here для получения дополнительной информации. Он должен будет соответствовать идентификатору, предоставленному при создании модели Movie.

var Movie = mongoose.model('Movie', movieSchema); 

Таким образом, вы могли бы иметь в схеме:

var userSchema = mongoose.Schema({ 
    name: String, 
    favorite_movies: { type: Schema.Types.ObjectId, ref: 'Movie' } 
}); 
var User = mongoose.model('User', userSchema); 

Я использовал строку Movie как в Schema определении и при создании Movie типа. Они должны быть точно такими же.

MongooseJs использует имя строки Model, чтобы определить, где взять документы при использовании ref и populate.

На выходе отладки вы можете увидеть, как Mongoose действительно запрашивает неправильную коллекцию, так как я ожидаю, что он найдет movies.find, чтобы найти соответствующие документы Movie.

+0

Спасибо за ваш ответ WiredPrairie, меняет свой userSchema, как вы сказали: ** фильмы: [{типа: mongoose.Schema.Types.ObjectId, ссылка: "movieModel"}] ** Теперь я облицовочный новую ошибку: ** "проливают новый MongooseError.MissingSchemaError (имя); MongooseError: Схема не была зарегистрирована для модели„movieModel“** Я не знаю, что здесь происходит :( – Arawn

+0

Вы Я не думаю, что внесение изменений корректно. Строка, которую вы используете в 'ref', должна точно соответствовать имени, используемому для регистрации модели. Может быть:' 'Movie '' например. – WiredPrairie

+0

Нет. Я уверен, что моя строка верный.Я определяю свою модель следующим образом: var movieModel = mongoose.model ("movie", movieSchema); Это действительно беспокоит меня, поскольку я не понимаю, откуда эта проблема. Мне было интересно, моя проблема связана с тем, как я вставляю данные в свою базу данных? В настоящее время я помещаю все свои данные в файл js в формате JSON. И я вставляю их, введя в командной строке: mongo datafile.js Нужно ли использовать mongoose для вставки данных? Извините, если мой вопрос кажется глупым, но это самое первое приложение, которое я создаю, используя mongoDB, mongoose и nodejs. Спасибо – Arawn

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