填充聚合了两个不同集合的Mongoose虚拟

时间:2020-04-05 19:39:31

标签: mongodb mongoose

我的应用当前存在一些复杂情况,导致我遇到各种问题。作为该应用程序的一部分,我们正在构建食谱,这些食谱由各种成分组成(此处也简称为“食品”,因为它们也可以单独使用)。我们具有静态配方的集合,以及与用户关联时从静态版本复制的动态(“用户”)配方之一。从技术上讲,这些食谱全都集中在一个集合中,但使用了鉴别器。

但是,对于食品,我们有从第三方购买的数据库,但是我们可能还需要添加自己的食品。由于来自第三方数据库的更新可能需要覆盖该数据库,因此我们需要将第三方食品与我们创建的食品分开。因此,在这里我们需要两个完全独立的集合,分别称为“ 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];
    }
  );
}

0 个答案:

没有答案
相关问题