2016-09-06 84 views
0

我们想在我们当前的项目中应用一些审核。为此,我们创建了一个场景,但我看不到如何使原子的点数为和。MongoDB:验证文档未更新

方案

每个文档都必须有一个timestamp是将服务器 一个版本。当保存文档,我们将:

  1. 验证文件没有改变 -首先比较的最新文件的timestampsdocLatest 与我们想用来存储docUpdated文档。 timestamps必须相等。
    • 如果不是,保存请求被拒绝。
    • 如果可以,转到下一点。
  2. 更新文档
  3. 与以前的文档创建差异 -最新的文档必须是我们的最后 文件。我们将创建一个差异并存储它。

回答

1

我偶然发现了这个想法。我的想法将利用long_polling技术。我不打算告诉你如何构建数据,但可以将日期转换为数值,然后再进行比较。

为1和2,你可以转换日期,格式为数字,该模式将类似于下面:

var document= { 
    updatedAt: { type: Number, default: Date.parse(new Date()) } 
} 

然后提交客户每一份文件,只是检查,如果

if(latestDocument.updatedAt - prevDocument.updatedAt > 0) { 
    //if latest's timestamp is bigger than prev, then store it in mongodb 

} else { 
    //if latest document is the same or even older, just ignore this document 
} 

为3号。我发现,如果文档已经改变,你甚至需要区别吗?我决定遵循反应/助焊剂的方法,如果文档已经改变,只需更换整个文档。

+0

Thx vdj4y!我需要区分它。我们将使用差异来审计日志。 我踩了一个更自然的解决方案mongoDb。看看http://mongoosejs.com/docs/guide.html并搜索'option:versionKey'。它为乐观锁定做好了准备。在我的情况下,它会用'__v'代替'timestamp',它是一个简单的非负数。但我不能让'__v'出现在我的任何文档中...... – zatziky

+0

很酷,这非常有趣。虽然在你的情况下,我认为这是毫无意义的,因为我认为你想检查当前文档是否是最新的,然后用最新的时间戳替换旧值(以取代不增加它),所以锁定可能不需要,除非你计划是增加版本。干杯 – vdj4y