我正在处理">每个用户一个数据库";系统使用CouchDB复制和选择器根据用户配置过滤我的数据。
它工作得很好,直到有一天我注意到复制有问题,我很难描述它,所以我将举一个例子:
我有我的主数据库">mainDB";我用它作为">源";数据库进行复制,并且我决定创建一个子数据库">subDB";对于将成为"用户"的用户目标";用于复制。
我用我的选择器创建我的复制文档,以从我的">mainDB";什么也没发生,我的">subDB";如果为空,则复制状态被标记为"是">运行";但是0个挂起的更改。
并且一旦i从">mainDB";(应该被复制到我的">subDB"的doc(_rev";的文档将更改,复制真正开始并将我的文档复制到">subDB";。
简而言之,基于选择器的CouchDB过滤复制不会复制任何文档,直到我们更新"_rev";每个应该被复制的文档。
应用程序版本Apache CouchDBv.3.2.2
编辑1选择器如下所示:
{
"selector": {
"$or": [
{
"date_debut": {
"$lte": "#end_date#"
},
"typedoc": "ActiviteDocument",
"date_fin": {
"$gte": "#start_date#"
},
"id": {
"$in": [
#array_of_integer_A#
]
}
},
{
"typedoc": "IndividuDocument",
"id": {
"$in": [
#array_of_integer_B#
]
}
},
(JSON too long to full parse here, but other part of the $or use same logical)
...
}
编辑2:我使用$or和$以及更改了选择器逻辑
"selector": {
"$or": [
{
"$and": [
{
"typedoc": "ActiviteDocument"
},
{
"date_debut": {
"$lte": "#end_date#"
}
},
{
"date_fin": {
"$gte": "#statt_date#"
}
},
{
"id": {
"$in": [#array_of_integer_A#]
}
}
]
},
{
"$and": [
{
"typedoc": "IndividuDocument"
},
{
"id": {
"$in": [#array_of_integer_B#]
}
}
]
},
EDIT 3:我通过删除选择器并使用";doc_ids";,复制不会复制我的文档,除非我更新其中一个文档_rev";更改和复制检测到并开始工作
{
"_id": "replicationmaster-1123",
"source": "mysource",
"target": "mytarget",
"doc_ids": [
"ActiviteDocument_335765",
"ActiviteDocument_351882",
"ActiviteDocument_421350",
"ActiviteDocument_423684",
"ActiviteDocument_428304",
"ActiviteDocument_440523",
"ActiviteDocument_442048",
"ActiviteDocument_443727"
],
"continuous": true,
"create_target": false,
"owner": "admin"
}
编辑4:演示https://youtu.be/OqJA0fDQqy8
问题是,在选择器JSON中,$or
参数需要是一个对象数组,每个对象都是一个单独的条件。按照你的方式,这个参数是一个数组,其中有一个包含所有条件的对象
以下是基于您的条件的完整复制器文档,语法正确:
{
"_id": "abc12357",
"source": "https://username:password@mycouchdb.com/db1",
"target": "https://username:password@mycouchdb.com/db2",
"selector": {
"$or": [
{
"start": {
"$lte": "2022-10-27"
}
},
{
"typedoc": "ActiviteDocument"
},
{
"end": {
"$gte": "2022-09-29"
}
},
{
"id": {
"$in": [
65993,
63938,
87265,
312112,
64885,
64277
]
}
}
]
}
}