首页 > 解决方案 > 更新 MongoDB 中的实体时,避免单次执行中的多个事务

问题描述

我正在使用 2 个 MongoDB 集合Recipe、 和Menu. 单个Menu是 的组合Recipe。有关更多信息,请参阅以下代码段

@Document
public class Recipe {
   private String id;
   private String name;
   private String description;

   // getter and setter
}

@Document
public class Menu {
   private String id;
   private String name;
   private List<RecipeItem> recipeItem;

   // getter and setter
}

public class RecipeItem {
   private String id;
   private String name;
   private String description;

   // getter and setter
}

RecipeItem只是集合Recipe中引用的对象的副本Menu

保存Menu集合后,您可以将食谱添加到菜单中,因此Recipe对象列表也将保存在Menu集合中,名称为RecipeItem. 当其中任何一个Recipe被更新时,在RecipeItem其中的对应Menu也需要被更新。否则,菜单中的菜谱与Recipe更新后的当前菜谱相比会过时。所以我必须迭代Menu包含更新Recipe的集合,Id并且需要更新Menu集合中的配方信息。

因此更新Menu函数将在一次执行中启动多个事务,因此我们也需要回滚机制。所以我不是很喜欢这种方法。

我是 MongoDB 新手,我想验证 和 的当前数据库设计是否Menu正确Recipe?如果是,那么最佳的做法是什么?我知道可以在集合之间使用数据库引用,但是会对性能产生影响。

标签: mongodbnosqlspring-data-mongodb

解决方案


Menu文档应存储Recipes ID 的列表,而不是配方本身。然后就可以省去直接RecipeItem使用了Recipe

Recipea由以下组成似乎更明智RecipeItems(苹果馅饼由面粉、糖、鸡蛋、苹果等组成)。

在任何情况下,引用都会消除保持两个列表同步的需要。


推荐阅读