【问题标题】:How to populate nested entity in Mongoose?如何在猫鼬中填充嵌套实体?
【发布时间】:2019-01-16 17:01:45
【问题描述】:

我有这样的模型:

const UserSchema = new mongoose.Schema({
  name: String,
  workspaces: [
    {
      workspace: {
        type: mongoose.Schema.ObjectId,
      },
      owner: Boolean
    }
  ]
});

const WorkspaceSchema = new mongoose.Schema({
  title: String,
  description: String 
});

我想像这样填充用户记录:

{
  name: "John",
  workspaces: [{
    workspace: {
      title: "First space",
      description: "About space#1"
    },
    owner: true
  }, {
    workspace: {
      title: "Second space",
      description: "About space#2"
    },
    owner: false
  }]
}

我尝试通过填充方法来做到这一点:

const user = await User
  .findOne(query)
  .populate({
    path: 'workspaces',
    populate: {
      path: 'workspace',
      model: 'Workspace'
    }
  });

这是不正确的。我搜索了这样的案例,但没有找到类似的东西。所有其他示例都不包括像我的布尔“所有者”这样的属性。

【问题讨论】:

  • 当然,我可以将owner属性移动到Workspace模型中,参考User。但在我的实际情况下,我也有 permissions: {read: Boolean, write: Boolean}owner 处于同一级别的属性@
  • 使用 $push 和 $each docs.mongodb.com/v3.2/reference/operator/update/push/…。避免使用通常不使用现代功能的库,这些功能在未来将是原子的并且更高效。

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


【解决方案1】:

使用深度填充

安装:

npm i mongoose-deep-populate

用法:

var deepPopulate = require('mongoose-deep-populate')(mongoose);

User.deepPopulate(users, 'workspaces.workspace')
.then(function(err, data) {
    console.log(data);
});

阅读更多:https://www.npmjs.com/package/mongoose-deep-populate

希望这能解决您的问题。

【讨论】:

    【解决方案2】:

    我建议您在用户架构声明中添加对工作区模型的引用:

     workspace: {
        type: mongoose.Schema.ObjectId,
        ref: "Workspace"
     }
    

    另外,您可能搞砸了填充方法,因为workspaces 数组本身不包含对外部对象的引用。 您可能应该像这样使用这种方法:

    const user = await User
      .findOne(query)
      .populate("workspaces.workspace");
    

    或者,如果您需要除路径之外的任何其他选项,请与选项对象一起使用:

    const user = await User
      .findOne(query)
      .populate({
        path: "workspaces.workspace", ...
      });
    

    【讨论】:

    • 是的,这对我有用!但结果我得到了像下面这样的结构。注意“_id”道具。这很相似,但不一样!为什么会这样? { 名称:“John”,工作区:[{ 工作区:{ _id:“5b6c3a7d39606df14010fbc0”,标题:“第一个空间”,描述:“关于空间#1”},所有者:true,_id: "5b6c3a7d39606df14010fbc1" }
    • 那是因为 mongo 默认为嵌套集合创建 _id。您可以通过设置 _id: false 选项来禁用此行为。看看那里stackoverflow.com/questions/17254008/…
    猜你喜欢
    • 1970-01-01
    • 2021-12-25
    • 2015-11-24
    • 1970-01-01
    • 2015-02-09
    • 2021-11-07
    • 2014-07-28
    • 2016-08-17
    相关资源
    最近更新 更多