Mongoose populate返回undefined

时间:2014-01-25 11:03:35

标签: node.js mongoose

我目前正在尝试使用mongo和node.js开发应用程序。

当我想构建使用populate选项的查询时,我遇到了问题。

以下是我的架构:

// 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" });

如您所见,每个用户都有一组电影,这个数组包含有效的电影ID。我想要的是拥有用户的电影。这就是我构建查询的方式:

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:无法读取未定义的属性'标题'”。我检查了mongoose的文档,不明白我为什么会收到这个错误。

我想指定我的数据库包含有效数据。 我把mongoose放在调试模式下,这是执行的查询:

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

第二行的两个ID是有效的电影ID。我想展示他们的名字。

非常感谢你的帮助。

1 个答案:

答案 0 :(得分: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的字符串名称来确定在使用refpopulate时从哪里获取文档。

在调试输出中,您可以看到Mongoose实际上是如何查询错误的集合的,因为我希望它使用movies.find来查找相关的Movie文档。