在我们的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()
逐个链接?如果没有,我也欢迎其他建议。
答案 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文档,您无法向其传递数组。