如何在猫鼬中填充嵌套实体?

时间:2018-08-09 09:30:27

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

我有这样的模型:

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'
    }
  });

这是不正确的。我搜索了这种情况,但没有发现任何类似的情况。所有其他示例均不包含像我的布尔“所有者”这样的属性。

2 个答案:

答案 0 :(得分:0)

使用深度填充

安装:

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

希望这可以解决您的查询。

答案 1 :(得分:0)

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

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

此外,您可能会弄混populate方法,因为workspaces数组不包含对外部对象本身的引用。 您可能应该使用这种方法:

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

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

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