【问题标题】:Mongoose populate not working as expected猫鼬填充未按预期工作
【发布时间】:2018-08-28 00:50:29
【问题描述】:

我在使用 mongoose 方面非常陌生,并且在 mongodb 上完成了简单的数据库工作。

看到我的用例,我发现了这种在 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');

我最初有这两种模式。我想创建一个投票活动。创建投票事件后,voting schema 中的事件 ID 应按建议存储,我更希望将投票事件引用存储在 EventSchema 中。

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 会是什么样子。但是在尝试了代码后,它看起来像上面一样。

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

谢谢

【问题讨论】:

标签: node.js mongodb mongoose mongoose-schema mongoose-populate


【解决方案1】:

ObjIds 数组应该在 schema 中这样定义:

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

同样在数组类型的字段(如 root 字段)上调用 population 将在 API 的 res 中返回一个空数组,请参阅mongoose.set('debug', true); 命中的查询,您会注意到 mongoose 在事件模型中搜索而不是 root。

尽管您必须在填充方法中告诉 mongoose 使用哪个模型才能使填充工作正常,除非您告诉 mongoose 在哪个模型中搜索。

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

【讨论】:

  • 你能解释一下答案的第二部分吗?
  • 如果您在我们定义的父模式中定义了 objectid 数组,您应该通过指定要填充的字段的路径和该字段的模型,在 5he 填充方法中提供填充额外的详细信息指
  • 我现在测试了它。结果是一样的。
  • 没有路径应该是字段名,模型应该是事件
猜你喜欢
  • 2017-10-17
  • 2017-08-20
  • 2023-02-03
  • 2021-07-22
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
相关资源
最近更新 更多