javascript - 在 couchDb 中存储大型 JSON 对象的好方法是什么?

标签 javascript web-applications couchdb offline pouchdb

我正在开发一个存储项目数据的网络应用程序。数据保存在 couchDb 数据库 A 中。应用程序使用本地 pouchDb 数据库 B 拉取和推送数据,该数据库与 A 同步。

因此该应用程序也可以离线工作。当用户恢复连接时,离线期间对 localDb B 所做的更改将使用经典复制发送到 A。

我在 couchDb 中为每个项目存储 1 个文档,它是一个包含大量数据的大型 JSON 对象(项目待办事项、协作者、进展、风险、问题等...)。

它工作起来就像一个魅力,但我有一些问题,而且我似乎以错误的方式使用 pouchDb。情况举例:

用户 A 离线,他在项目 1 上添加了一个待办事项。

用户 B 在线,并且他在项目 1 上添加了一位新协作者。

用户 B 的更改会通过自动同步推送到 couchDb。

项目 1 _rev 已增加。

用户 B 从 couchDb 中提取自己的更改,因为应用程序会下载检测到的任何 couchDb 更改上的所有文档。奇怪...我不知道如何防止这种情况发生。但该应用程序仍然可以正常工作,所以这不是一个大问题。

用户 A 恢复连接。

由于 _rev 较旧,用户 A 的更改将被忽略。但是用户对不同的项目属性进行了修改,couchDb 可以检测到自己并与较新的 _rev 合并吗?

我清楚地看到我的问题是每个项目使用 1 个文档。我可以使用数千个文档来存储每个项目的每个属性,并且我的问题不会发生,但这看起来很奇怪:要检索项目的所有数据,我将完全扫描我的数据库,检查文档类型(协作者,待办事项,.. .?),并通过向任何文档添加新的 _projectId 属性来检查文档是否链接到项目。

目前我只需要请求一个包含所有项目数据的文档,然后我就可以轻松地操作我的 JSON。处理起来相当方便。

如何管理这个?一个项目平均可能包含 10 到 10,000 个属性,多个用户可以在线或离线编辑这些属性。

最佳答案

But the user did a modification on a different project property, can couchDb detect that himself and merge with newer _rev ?

PouchDB 指南中描述了 PouchDB/CouchDB 冲突处理:http://pouchdb.com/guides/conflicts.html

the app downloads all documents on any couchDb changes detected. Weird... Idk how to prevent that.

这是标准的 PouchDB/CouchDB 行为 - 您要求它同步整个数据库,因此它同步了整个数据库。 :) 您可以通过使用过滤复制来防止它:http://pouchdb.com/api.html#filtered-replication

How to manage this ? A project may contains averagely 10 to 10 000 properties that multiple users can edit being online or offline.

这实际上取决于您的数据、它可能更改的频率、单个“属性”的唯一标识符是什么...不过,在 PouchDB/CouchDB 中存储 10,000 个单独的文档并不是一个疯狂的想法,并且可能会有所帮助当涉及到冲突时,您就会出局,因为只有那些单独的文档才会发生冲突。

一般来说,我建议您阅读上述冲突解决指南并检查您的选择。还有一个插件可以帮助您解决冲突:https://github.com/jo/pouch-resolve-conflicts

关于javascript - 在 couchDb 中存储大型 JSON 对象的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30073911/

相关文章:

javascript - Firebase 分析未显示 Web 应用程序的数据

oauth - CouchApp 用户注册

javascript - 性能 - foreach 内部条件 vs 具有相同条件的过滤器和 javascript 中过滤数组的 foreach

javascript - 如何使用 Chrome 工具栏上的音乐内容按钮?可以定制吗?

security - 强制字母数字用户 ID

java - CouchDb - MongoDb 和 NoSQL 数据库比较(使用 XML 文档)

nosql - 使用 :group_level and :key 的 CouchDB 查询

javascript - 我怎样才能使 angular.js 路由长路径

javascript - 如何使 Cytoscape.js 中的边缘不被拦截?

javascript - 我们如何直接设置border-radius选定方向的水平值分量呢?