在包装函数中处理猫鼬的populate()功能

时间:2019-05-23 12:23:26

标签: mongodb mongoose

在我们的Node / MongoDB项目中,我们有一个包装函数,用于所有findOne()操作,以便集中处理权限等方面。我遇到的问题涉及Mongoose populate()功能。

因为我们在所有findOne()上都使用了包装函数,所以我需要在包装函数级别定义populate()逻辑。但是由于函数所需的populate()数量不同,因此我不得不在包装函数中写条件语句,如下所示:

 if (mongooseModelObject.modelName === "Staff" && this.parameters.populateArray) {
    return await mongooseModelObject
      .findOne(searchObject, options)
      .setOptions({ authLevel: this.permissionString, permissions: true })
      .populate(this.parameters.populateArray[0].targetId, this.parameters.populateArray[0].limit)
      .populate(this.parameters.populateArray[1].targetId, this.parameters.populateArray[1].limit)
      .populate(this.parameters.populateArray[2].targetId, this.parameters.populateArray[2].limit)
      .populate(this.parameters.populateArray[3].targetId, this.parameters.populateArray[3].limit)
      .populate(this.parameters.populateArray[4].targetId, this.parameters.populateArray[4].limit)
      .populate(this.parameters.populateArray[5].targetId, this.parameters.populateArray[5].limit);
  } else {
    return await mongooseModelObject.findOne(searchObject, options).setOptions({ authLevel: this.permissionString, permissions: true });
  }

如果我可以将数组传递给populate(),这将使事情变得简单得多。这样,无论我需要在一个或五个属性上使用populate(),它仍然可以工作。

猫鼬允许的东西吗?还是我必须像我包含的代码中那样将populate()逐个链接?如果没有,我也欢迎其他建议。

1 个答案:

答案 0 :(得分:3)

您可以在populateArray上循环

 await this.parameters.populateArray.reduce((tmp, {
    targetId,
    limit,
  }) => tmp.populate(targetId, limit), mongooseModelObject
  .findOne(searchObject, options)
  .setOptions({
    authLevel: this.permissionString,
    permissions: true,
  }));

根据populate文档,您无法向其传递数组。