我目前正在尝试使用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。我想展示他们的名字。
非常感谢你的帮助。
答案 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
的字符串名称来确定在使用ref
和populate
时从哪里获取文档。
在调试输出中,您可以看到Mongoose实际上是如何查询错误的集合的,因为我希望它使用movies.find
来查找相关的Movie
文档。