如何在Mongo中管理草稿和多个版本?

时间:2014-03-05 19:55:36

标签: mongodb database-design

这是我之前question的后续内容。

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

目前,当Alice更改目录时,Bob会立即看到更改 。现在,我们希望只有在Alice明确发布它们时才能看到更改。例如:

  1. 有一个由Product A, Product B, and Product C组成的目录。爱丽丝和鲍勃都看到了相同的产品。

  2. Alice更改了目录。她修改了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

  4. 我的问题是:

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

1 个答案:

答案 0 :(得分:1)

啊时态数据,无处不在的数据库开发人员的祸根。

幸运的是,在mongodb中,这比其他关系dbs更容易。

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

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

{ 
 _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: ... } } }

每个用户都有一个单独的副本。当然,当一个用户发布它时,可以完全删除该实体。我当然建议在根项目中添加一个'deleted'标志,而不是实际从db中删除它,除非这些对象是巨大的。 (当然,将已删除的标记编入索引。)