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

时间:2015-05-06 10:19:05

标签: 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重新获得其连接。

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

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

目前我只需要一个包含所有项目数据的文档,然后轻松操作我的JSON。处理起来非常方便。

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

1 个答案:

答案 0 :(得分:1)

  

但是用户对不同的项目属性进行了修改,couchDb可以检测到自己并与更新的_rev合并吗?

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

  

应用程序会在检测到的任何couchDb更改中下载所有文档。奇怪......我想如何防止这种情况。

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

  

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

这实际上取决于您的数据,它可能会改变的频率,单个"属性的唯一标识符"是......在PouchDB / CouchDB中存储10,000个单独的文档并不是一个疯狂的想法,并且可以帮助你解决冲突,因为只有那些单独的文档可能会发生冲突。

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