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

Posted

技术标签:

【中文标题】如何在猫鼬中填充嵌套实体?【英文标题】: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: Booleanowner 处于同一级别的属性@ 使用 $push 和 $each docs.mongodb.com/v3.2/reference/operator/update/push/…。避免使用通常不使用现代功能的库,这些功能在未来将是原子的并且更高效。 【参考方案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 选项来禁用此行为。看看那里***.com/questions/17254008/…

以上是关于如何在猫鼬中填充嵌套实体?的主要内容,如果未能解决你的问题,请参考以下文章

如何仅在猫鼬中使用聚合填充嵌套在对象数组中的字段?

在猫鼬中填充嵌套模型

在猫鼬中填充嵌套模型

您可以在猫鼬中执行多个嵌套填充吗?

如何在猫鼬中填充模型

如何在猫鼬中更新嵌套数组值