2014-01-25 43 views
0

我目前正在尝试开发一个使用mongo和node.js的应用程序。猫鼬填充返回undefined

我在构建使用填充选项的查询时遇到问题。

这里是我的架构:

// 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行显示的第一部电影的头衔,我得到了一个错误“类型错误:无法读取属性“标题'未定义“。我检查了猫鼬的文档,不明白为什么我得到这个错误。

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

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

第二行两个ID电影的有效身份证件。我想显示他们的名字。

非常感谢您的帮助。

回答

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类型时,我使用的字符串Movie同时在Schema定义和。他们需要完全一样。

MongooseJs使用Model的字符串名称来确定从使用refpopulate时获取文档的位置。

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

+0

谢谢您的回答WiredPrairie, 更改我的userSchema像你说: **的电影:[{类型:mongoose.Schema.Types.ObjectId,REF: “movieModel”}] ** 现在我面临一个新的错误: **“抛出新的MongooseError.MissingSchemaError(名称); MongooseError:架构尚未注册模型”movieModel“** 我不知道这是怎么回事:( – Arawn

+0

你并没有正确地改变我的想法,你在'ref'中使用的字符串需要与用于注册模型的名字完全一致,比如:''Movie“' – WiredPrairie

+0

不,我确定我的字符串是正确。我正在像这样定义我的模型: var movieModel = mongoose.model(“movie”,movieSchema); 这真的让我困扰,因为我不明白这个问题从何而来。 我想知道,我的问题与我在数据库中插入数据的方式有关吗?目前,我将所有数据都以JSON格式存储在js文件中。我通过在命令行中输入来插入它们:mongo datafile.js 我需要使用mongoose插入数据吗?对不起,如果我的问题似乎很愚蠢,但这是我使用mongoDB,mongoose和nodejs构建的第一个应用程序。 谢谢 – Arawn