我的应用当前存在一些复杂情况,导致我遇到各种问题。作为该应用程序的一部分,我们正在构建食谱,这些食谱由各种成分组成(此处也简称为“食品”,因为它们也可以单独使用)。我们具有静态配方的集合,以及与用户关联时从静态版本复制的动态(“用户”)配方之一。从技术上讲,这些食谱全都集中在一个集合中,但使用了鉴别器。
但是,对于食品,我们有从第三方购买的数据库,但是我们可能还需要添加自己的食品。由于来自第三方数据库的更新可能需要覆盖该数据库,因此我们需要将第三方食品与我们创建的食品分开。因此,在这里我们需要两个完全独立的集合,分别称为“ foodsTP”和“ foodsAdmin”。但是,因为从用户的角度来看,这些功能的作用应该完全相同,所以我们不希望前端关心食物来自哪个集合。
直接获取食物时,这不是问题。我们在配方上有一个虚拟的吸气剂,它结合了两个系列的食物:
RecipeBaseSchema.virtual('foods').get(function get() {
return this.foodsTP.concat(this.foodsAdmin);
});
但是,一旦将食物添加到食谱中,获取食谱的API请求就不会正确填充食物信息。我看过this个有关Virtual Populate的文档,但这似乎不是我所需要的。我在这里的虚拟内容不仅是对其他集合的引用,它还积极地将对其他两个集合的引用组合在一起。当我们将这些食物组合在一起时,我们应该能够从两个集合中获取所有食物信息。但是,这是我在控制台中看到的错误:
如果要填充虚拟机,则必须设置localField和 foreignField选项
我可以用组合的虚拟阵列执行此操作吗?
编辑:这是简化的配方架构。
const RecipeBaseSchema = new Schema({
name: {
type: String,
required: true,
},
foodsTP: [{
quantity: {
type: Number,
default: 1,
},
measureUnit: String,
food: {
type: Schema.Types.ObjectId,
ref: 'Food',
},
}],
foodsAdmin: [{
quantity: {
type: Number,
default: 1,
},
measureUnit: String,
food: {
type: Schema.Types.ObjectId,
ref: 'FoodAdmin',
},
}],
dateAdded: Date,
dateModified: Date,
},
{
toJSON: { virtuals: true },
toObject: { virtuals: true },
}); // options
const RecipeUserSchema = new Schema({});
const RecipeAdminSchema = new Schema({});
API查询:
export function getRecipeUser(params) {
params.populate = [
{
path: 'foods',
populate: { path: 'food' },
},
];
params.query = {
_id: params.recipeId,
};
return apiCall('get', `/recipeuser`, omit(params, ['recipeId'])).then(
recipesUser => {
console.log(recipesUser);
return recipesUser[0];
}
);
}