【问题标题】:Avoid multiple transactions within single execution when updating entities in MongoDB更新 MongoDB 中的实体时,避免单次执行中的多个事务
【发布时间】:2020-04-01 21:35:02
【问题描述】:

我正在使用 2 个 MongoDB 集合,RecipeMenu。单个MenuRecipe 的组合。有关详细信息,请参阅下面的代码段

@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 对象列表也将以RecipeItem 的名义保存在Menu 集合中。当Recipe中的任何一个更新时,Menu中对应的RecipeItem也需要更新。否则,与更新后的当前Recipe 相比,菜单中的配方会过时。所以我必须迭代 Menu 集合,其中包含由 Id 更新的 Recipe 并且需要更新 Menu 集合中的配方信息。

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

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

【问题讨论】:

    标签: mongodb nosql spring-data-mongodb


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      • 2020-10-23
      • 1970-01-01
      相关资源
      最近更新 更多