3

请分享您对部分更新 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 文档的经验。

4

1 回答 1

6

您只需要在 RethinkDB 中进行一次查询。假设你想1用值 {foo: 1, bar: 2} 更新 id 的文档,并增加字段“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/

于 2014-09-24T17:13:25.457 回答