ObjectIds数组不会在没有错误的情况下填充

时间:2013-11-23 00:40:24

标签: javascript node.js mongoose

我有以下mongoose架构:

var ChatSchema = new Schema({
    pin: String,
    users: [{type: mongoose.Schema.Types.ObjectId, ref: "User"}],
    messages: [{type: mongoose.Schema.Types.ObjectId, ref: 'Message'}], //<----
    active: Boolean,
});

var MessageSchema  = new Schema({
        sent: Date,
        user: {type: mongoose.Schema.Types.ObjectId, ref: 'User'},
        content: String
});

var UserSchema = new Schema({
    name: String,
    pin: String,
    id: String
});

此功能是为ChatSchema

定义的
ChatSchema.methods.addMessageForUser = function(message, userid, userpin ) {
    chat = this;
        module.exports.User.findOne({id: userid, pin: userpin}).populate('messages').exec(function(err, user) {
             message = {
                user: user,
                time: new Date(),
                message: message,
            };
            chat.messages.push(message);
            chat.save();
        });

};

当我运行它时,我收到以下错误:

CastError: Cast to ObjectId failed for value "[object Object]" at path "messages"

如果我删除populate('messages);`然后错误就消失了,但是我得到了另一个错误,因为我尝试使用messages数组。

以下是模型的代码:

module.exports.Message = mongoose.model('Message', MessageSchema);

module.exports.User = mongoose.model('User', UserSchema);

module.exports.Chat = mongoose.model('Chat', ChatSchema);

1 个答案:

答案 0 :(得分:1)

根据你在这里得到的东西,你试图向后填充。

如果每个User都有一个Messages数组,那么这个populate调用就可以了。在这种情况下,它是mongoose Query对象上的一个方法,因此它正在查找messages集合中的文档中名为User的属性,您正在查询以从中提取ID:由于这些不存在,你会得到一个奇怪的错误。

根据您所拥有的内容,如果您只是移除populate来电,它看起来会有效。