【问题标题】:Is RethinkDB useful on partial updating json documents according rfc6902?RethinkDB 对根据 rfc6902 部分更新 json 文档有用吗?
【发布时间】:2014-11-19 03:59:20
【问题描述】:

请分享您对部分更新 JSON 文档的经验。现在我将我的 JSON 文档存储在 MongoDB 中,如下所示:

{
  id: ObjectId(507f191e810c19729de860ea),
  title: 'Sterling Archer',    
  comments: [
    {text: 'Comment text', tags: ['tag1', 'tag2', 'tag3']},
    {text: 'Comment test', tags: ['tag2', 'tag5']}
  ]  
}

我需要经常使用rfc6902 规范更新我的文档。现在,我做的不是优化的方式,看起来如下(我在这个例子中使用了 nodejs/express/mongoose 和 fast-json-patch 模块):

var jsonpatch = require('fast-json-patch');

app.patch('/document/:id', function (req, res, next) {
   var document_id = req.params.id;

   // req.body.patch: { "op": "add", "path": "/comments/2", "value":  {text: 'Comment test3', tags: ['tag4']}" }
   var patches = req.body.patch; 

   // find document
   Document.findById(document_id, function (err, document) {
       // Applying patches
       jsonpatch.apply(document, patches);

       // Update whole document in MongoDB
       Document.update({_id: document_id}, document, function (err) {
           return res.status(200).send(); 
       });
   });
});

由于 MongoDB 中有两个查询并替换整个文档,因此这不是修补文档的优化方法。所以我正在寻找优化的方法,并想尝试 RethinkDB 来完成这项任务。你能帮我检查一下使用 RethinkDB 的单个查询来检查原子文档更新的可能性吗?还是我应该寻找另一种方法来解决我的问题?

请分享您对部分更新 JSON 文档的经验。

【问题讨论】:

    标签: json node.js mongodb rethinkdb json-patch


    【解决方案1】:

    您只需要在 RethinkDB 中进行一次查询。假设你想用值 {foo: 1, bar: 2} 更新 id 为 1 的文档,并增加字段“count”,你会这样做

    r.table("data").get(1).update(function(doc) {
        return doc.merge({foo: 1, bar:2, count: doc("count").add(1) })
    })
    

    虽然此更新需要唯一的查询,但整个文档都会更新。 如果您有大文档,您可以将它们拆分为多个表并稍后执行连接以检索数据。 您可能有兴趣阅读这篇关于数据建模的文章:http://www.rethinkdb.com/docs/data-modeling/

    【讨论】:

    • 感谢您的回复。不幸的是,我不能在多个表中拆分文档。 RethinkDB 不喜欢大型嵌套 JSON 文档吗?
    • 这取决于你所说的大和你的工作量。话虽如此,它应该可以正常工作。 RethinkDB 在 SSD 上特别高效。但我想唯一真正的答案是尝试你的工作量?
    • 谢谢。您是否有在项目中使用部分 JSON 的经验?
    • (注意:我是 RethinkDB 的工程师)。据我所知,几乎每个人都使用 RethinkDB 进行部分更新——因为它更高效,而且我们已经习惯了(它类似于 SQL UPDATE 语句)。就个人而言,我在一些个人项目中使用它(比如增加日志的统计信息),它就像一个魅力。
    • 感谢您的回复。您提供的代码 sn-p 看起来不错我会尝试使用这个,但我不明白如何为move 补丁:[{ "op": "move", "from": "/foo/waldo", "path": "/qux/thud" }] 构建查询。能否提供 RethingDB 的代码示例?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    相关资源
    最近更新 更多