【问题标题】:Mongoose's populate() does not return data from databaseMongoose 的 populate() 不从数据库返回数据
【发布时间】:2019-02-10 02:42:17
【问题描述】:

我有以下 Schema,Base 是信息的万能收集器:

const BaseSchema = mongoose.Schema({
  creatorId: { type: mongoose.Schema.Types.ObjectId, required: true },
  title: { type: String, required: true },
  created: { type: Date, default: Date.now() },
  users: [{ type: mongoose.Schema.Types.ObjectId, ref: "User" }],
  messages: [{ type: mongoose.Schema.Types.ObjectId, ref: "Message" }]
});

还有:

const BaseUserSchema = mongoose.Schema({
  userId: { type: String },
  baseId: { type: mongoose.Schema.Types.ObjectId },
  created: { type: Date, default: Date.now() },
  acceptedMembership: { type: Boolean, default: false },
  isCreator: { type: Boolean, default: false }
});

(我有一个Message,看起来差不多) 后一种在const User = mongoose.model("User", UserSchema);中称为User 当我创建一个新的 Base 时,我会自动将一个用户添加到其中的列表中。在数据库中,我可以看到用户确实存在,但是当我调用以下字段时,该字段不会填充:

Base.find({ creatorId: req.params.id })
    .populate("users", "messages")
    .exec()
    .then(data => console.log(data));

我从 console.log 中得到以下信息:

[ { created: 2018-09-05T03:41:45.416Z,
    users: [],
    messages: [],
    _id: 5b8f508b2760c5329c13a9be,
    creatorId: 5b86f7970cd98b2004969bf0,
    title: 'testBase1',
    __v: 1 } ]

当我第一次通过 React 前端创建基础并将基础添加到列表中时,我看到 users.length 是 1,或者是自动创建的用户的长度。但是,当我刷新页面时,控制台中的用户列表为空。

添加: 忘记展示我在创建时如何填充用户列表:

router.post("/add", jwtAuth, (req, res) => {
    Base.create({
        creatorId: req.body.userId,
        title: req.body.title
    }).then(baseInfo => {
        BaseUser.create({
            userId: req.body.username,
            baseId: baseInfo._id,
            created: Date.now(),
            acceptedMembership: true,
            isCreator: true
        })
            .then(baseuser => {
                baseInfo.users.push(baseuser);
                return baseInfo.save();
            })
            .then(base => res.json(base.serialize()));
    });
});

【问题讨论】:

    标签: node.js mongodb reactjs mongoose


    【解决方案1】:

    回答

    .populate("users", "messages")
    

    首先将从users 返回messages。它必须是两个单独的条目,如下所示:

            .populate("users")
            .populate("messages")
    

    然后,在模型中

    users: [{ type: mongoose.Schema.Types.ObjectId, ref: "User" }],
    

    指错ref。应该是

    users: [{ type: mongoose.Schema.Types.ObjectId, ref: "BaseUser" }],
    

    来自

    const BaseUser = mongoose.model("BaseUser", BaseUserSchema);
    

    最后,我不确定是否需要这样做,但我在每个要填充的项目中添加了ref

    baseId: { type: mongoose.Schema.Types.ObjectId, required: true, ref: "Base" },
    baseId: { type: mongoose.Schema.Types.ObjectId, ref: "Base" },
    

    现在它就像一个魅力,无需额外的fetch

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-17
      • 2015-08-16
      • 1970-01-01
      • 2013-05-22
      • 2021-09-16
      • 2013-11-23
      • 2020-08-24
      相关资源
      最近更新 更多