这是我之前question的后续内容。
假设在Mongo
中存储了一个产品目录作为集合。用户Alice是目录管理员,可以更新,删除和添加产品到目录。用户Bob是客户,可以查看目录。
目前,当Alice更改目录时,Bob会立即看到更改 。现在,我们希望只有在Alice明确发布它们时才能看到更改。例如:
有一个由Product A, Product B, and Product C
组成的目录。爱丽丝和鲍勃都看到了相同的产品。
Alice更改了目录。她修改了Product A
,删除了Product C
,并添加了Product D
但未发布更改。
现在Alice看到了Product A' (modified), Product B, and Product D
,但Bob仍然看到了以前的版本:Product A, Product B, and Product C
。
Alice 发布目录。现在Alice和Bob都看到了相同的产品:Product A' (modified), Product B, and Product D
我的问题是:
Mongo
答案 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中删除它,除非这些对象是巨大的。 (当然,将已删除的标记编入索引。)