Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 猫鼬无法按预期工作_Node.js_Mongodb_Mongoose_Mongoose Schema_Mongoose Populate - Fatal编程技术网

Node.js 猫鼬无法按预期工作

Node.js 猫鼬无法按预期工作,node.js,mongodb,mongoose,mongoose-schema,mongoose-populate,Node.js,Mongodb,Mongoose,Mongoose Schema,Mongoose Populate,我对使用mongoose非常陌生,并且在mongodb上做过简单的db工作 看到我的用例,我发现了在mongodb中使用mongoose的这种方法。但是,我并没有得到教程中所示的预期结果 我的模式 var EventsSchema = new mongoose.Schema({ root: {type: mongoose.Schema.Types.ObjectId, ref: 'root'}, voting: [{type: mongoose.Schema.Types.Objec

我对使用mongoose非常陌生,并且在mongodb上做过简单的db工作

看到我的用例,我发现了在mongodb中使用mongoose的这种方法。但是,我并没有得到教程中所示的预期结果

我的模式

var EventsSchema = new mongoose.Schema({
    root: {type: mongoose.Schema.Types.ObjectId, ref: 'root'},
    voting: [{type: mongoose.Schema.Types.ObjectId, ref: 'Voting'}]
});

var VotingSchema = new mongoose.Schema({
    events: {type: mongoose.Schema.Types.ObjectId, ref: 'Events'},
    title: {
        type: String,
        required: true
    }
})

var Events = mongoose.model('Events', EventsSchema, 'event');
var Voting = mongoose.model('Voting', VotingSchema, 'voting');
我最初有这两个模式。我想创建一个投票事件。当投票事件被创建时,那么在
投票模式中
事件id应该按照建议存储,我更想要的是投票事件引用应该存储在
事件模式中

var events = new Events({});
events.save()
.then((events) => {
    var voting = new Voting({ events: events._id, title: "Test Title" });
    voting.save()
    .then((voting) => {
        Voting.findOne({title: 'Test Title'})
        .populate('events')
        .exec(function(err, voting){
            console.log(voting, err);
            if(err) res.sendStatus(401).send();
            else res.sendStatus(200).send();
        })

    })
    .catch((e) => {
        res.sendStatus(401).send();
    });
})
.catch((e) => {
    res.sendStatus(401).send();
})
我在控制台上看到的是

{ 
    _id: 5b83eca82a3cfb1dec21ddc9,
    events: { voting: [], _id: 5b83eca82a3cfb1dec21ddc8, __v: 0 },
    title: 'Test Title',
    __v: 0 
}
我的MongoDB看起来像这样

投票表决

{
    "_id" : ObjectId("5b83eca82a3cfb1dec21ddc9"),
    "events" : ObjectId("5b83eca82a3cfb1dec21ddc8"),
    "title" : "Test Title",
    "__v" : 0
}
事件

{
    "_id" : ObjectId("5b83eca82a3cfb1dec21ddc8"),
    "voting" : [],
    "__v" : 0
}
我不确定我的mongodb会是什么样子。但是在尝试代码之后,它看起来像上面那样

我一定是做错了什么或错过了什么重要的事情。但这种代码也存在于文档中。请帮我整理这个问题


感谢

在模式中,对象数组应该以这种方式定义:

var EventsSchema = new mongoose.Schema({
    root: {type: mongoose.Schema.Types.ObjectId, ref: 'root'},
    voting: {type: [mongoose.Schema.Types.ObjectId], ref: 'Voting'}//**array bracers** 
});
同样,在一个数组类型的字段(如根字段)上调用population将在API的res中返回一个空数组,请参见
mongoose.set('debug',true)命中的查询您会注意到mongoose正在事件模型而不是根中搜索

虽然你必须告诉猫鼬在种群方法中使用哪种模型才能使种群工作,除非你告诉猫鼬搜索哪种模型

populate({path:'vooting',model:'vooting'})

请仔细阅读。它包含如何添加的方法subdocument@deepakthomas谢谢你的链接。你能解释一下答案的第二部分吗?如果你在父模式中定义了objectid数组,就像我们定义的那样,您应该通过指定要填充的字段的路径以及该字段引用的模型,在5“填充方法”中提供一个额外的详细信息。结果相同。否路径应为字段名,模型应为事件