node.js - 在键值存储中保存带有修订的文档的最佳方法是什么?

标签 node.js mongodb key-value nosql

我是键值存储的新手,需要您的推荐。我们正在开发一个管理文档及其修订的系统。有点像 wiki。我们正在考虑将这些数据保存在键值存储中。

请不要给我推荐您喜欢的数据库,因为我们想破解它以便我们可以使用许多不同的键值数据库。我们正在使用 node.js,因此我们可以轻松地使用 json。

我的问题是:数据库的结构应该是什么样的?我们有每个文档的元数据(时间戳、最后文本、ID、最新版本),我们有每个修订的数据(更改、作者、时间戳等)。那么,您推荐哪种键/值结构?

谢谢

最佳答案

摘自 MongoDB groups .它在某种程度上特定于 MongoDB,但是,它非常通用。

大多数这些历史记录实现都分解为两种常见策略。

策略一:嵌入历史

理论上,您可以将文档的历史嵌入文档本身。这甚至可以原子地完成。

> db.docs.save( { _id : 1, text : "Original Text" } ) 
> var doc = db.docs.findOne() 
> db.docs.update( {_id: doc._id}, { $set : { text : 'New Text' }, $push : { hist : doc.text } } ) 
> db.docs.find() 
{ "_id" : 1, "hist" : [ "Original Text" ], "text" : "New Text" } 

策略二:将历史写入分离集合

> db.docs.save( { _id : 1, text : "Original Text" } ) 
> var doc = db.docs.findOne() 
> db.docs_hist.insert ( { orig_id : doc._id, ts : Math.round((new Date()).getTime() / 1000), data : doc } ) 
> db.docs.update( {_id:doc._id}, { $set : { text : 'New Text' }  } ) 

在这里你会看到我写了两次。一个到大师收藏和 一个到历史收藏。 要快速查找历史记录,只需获取原始 ID:

> db.docs_hist.ensureIndex( { orig_id : 1, ts : 1 }) 
> db.docs_hist.find( { orig_id : 1 } ).sort( { ts : -1 } )

  • 这两种策略都可以通过仅显示差异来增强
  • 您可以通过添加从历史集合原始集合的链接来混合

Whats the best way of saving a document with revisions in a key value store?

很难说有“最好的方法”。显然,这里需要进行一些权衡。

嵌入:

  • 单个文档的原子更改
  • 可能会产生大文档,可能会超出合理的大小限制
  • 可能必须增强代码以避免在不必要时返回完整的 hist

单独收集:

  • 更容易编写查询
  • 不是原子的,需要两个操作(你有交易吗?)
  • 更多存储空间(原始文档的额外索引)

关于node.js - 在键值存储中保存带有修订的文档的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5594970/

相关文章:

node.js - Meteor FS.Collection 访问服务器上的集合

node.js - node-sass 安装不允许的操作

JavaScript:从二维数组(标题,行)创建键值数据结构

macos - 使用 swift 读取 CFDictionary 中的值

node.js - 连接到 Redis 集群失败

node.js - 从Node.js中的sendGrid发送电子邮件时"UnhandledPromiseRejectionWarning: Error: Forbidden"

mongodb - 为什么多值字段在关系数据库中不是一个好主意

javascript - 在 Angular 2 应用程序中将一个属性传递给一个空的新对象

mongodb websrv 端口

java - 如果字符串与键条目匹配,如何返回键及其值