【问题标题】:How to manage drafts and multiple versions in Mongo?如何在 Mongo 中管理草稿和多个版本?
【发布时间】:2014-03-06 05:21:50
【问题描述】:

这是我之前的question 的后续。

假设有一个产品目录作为集合存储在Mongo 中。用户 Alice 是目录管理员,可以更新、删除和添加产品到目录。用户 Bob 是客户,可以查看目录。

当前,当 Alice 更改目录时,Bob立即看到了更改。现在我们希望这些更改只有在 Alice 明确发布 时才可见。例如:

  1. 有一个由Product A, Product B, and Product C 组成的目录。 Alice 和 Bob 看到的产品相同。

  2. 爱丽丝更改了目录。她修改了Product A,删除了Product C,并添加了Product D,但没有发布这些更改。

    现在 Alice 看到 Product A' (modified), Product B, and Product D,但 Bob 仍然看到以前的版本:Product A, Product B, and Product C

  3. Alice 发布了目录。现在 Alice 和 Bob 都看到了相同的产品:Product A' (modified), Product B, and Product D

我的问题是:

  • 如何用Mongo实现它
  • 如何管理目录的版本/修订,以便 Alice 能够撤消/重做她在目录中所做的更改。

【问题讨论】:

    标签: mongodb database-design


    【解决方案1】:

    啊,时间数据,世界各地数据库开发人员的祸根。

    幸运的是,这在 mongodb 中可以说比其他关系数据库更容易。

    如果您可以假设您最多只有一个未发布的版本,那么这个问题比您可以让不同的用户编辑未发布的版本要简单得多。

    假设你的架构中有一些标准的东西:

    { 
     _id: ObjectId
     name: String,
     CreatedDate: Date,
     Price: Number
    }
    

    您需要添加一个子文档,其中包含用户可编辑的任何字段的副本。它还将包含一个删除标志。

    { 
     _id: ObjectId
     name: String,
     createdDate: Date,
     price: Number,
     revised:     {      
         name: String,
         createdDate: Date,
         price: Number,
         deleted: Boolean,
         }
    }
    

    当用户编辑产品时,您会将现有道具复制到“修订”对象中。所有编辑都转到该对象。发布时,将这些项目复制回基础层,并删除“修订”属性。

    如果您有多个用户在编辑文档,并且他们看不到彼此的编辑内容,您可能会使修改后的文档更复杂一些

    { revised: { U1234: { name : ... }, U2345 : { name: ... } } }
    

    每个用户都有一个单独的副本。当然,当一个用户发布时,它可以完全删除该实体。我当然会建议在根项目中添加一个“已删除”标志,而不是从数据库中实际删除它,除非这些对象非常大。 (当然索引已删除的标志。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多