使用curl只复制couchDB中的一些文档



文档说我可以使用选择器语法将一个数据库部分复制到另一个数据库。它的工作原理与_find命令相同。所以我先用_find进行了测试。

我知道我想要复制的文档的_id,但它们足够多,我想使用regex。

我能够让这个命令发挥作用:

curl -H 'Content-Type: application/json' -d "{"selector":{"_id":"doc-A"}}" http://admin:PW@127.0.0.1:5984/mydb/_find

但不是我的正则表达式尝试;我想得到";doc-A"doc-B"文档XYZ"。。。以及";除此之外"除此之外;,等等

curl -H 'Content-Type: application/json' -d "{"selector":{"_id":{"$regex":"^(doc-|other-)"}}}" http://admin:PW@127.0.0.1:5984/mydb/_find

我得到的错误看起来很恶心:

{"error":"badmatch","reason":"{error,{{mango_error,mango_util,{invalid_field_name,<<"_id.">>}},
nil,
[{mango_util,check_non_empty,2,
[{file,"src/mango_util.erl"},{line,399}]},
{mango_util,parse_field,1,[{file,"src/mango_util.erl"},{line,382}]},
{mango_doc,get_field,3,[{file,"src/mango_doc.erl"},{line,375}]},
{mango_selector,match,3,[{file,"src/mango_selector.erl"},{line,572}]},
{mango_cursor_view,view_cb,2,
[{file,"src/mango_cursor_view.erl"},{line,257}]},
{couch_mrview,map_fold,3,[{file,"src/couch_mrview.erl"},{line,491}]},
{couch_bt_engine,include_reductions,4,
[{file,"src/couch_bt_engine.erl"},{line,1170}]},
{couch_bt_engine,skip_deleted,4,
[{file,"src/couch_bt_engine.erl"},{line,1165}]}]}}","ref":2902755775}

它似乎在说我不能使用_id来过滤?

我简要地看了一下Erlang regex支持,它似乎涵盖了我想要在这里实现的目标?

我在Ubuntu和Mint上运行couchdb 3.1.1。

退一步说,由于我不是根据文档内容进行选择,而是根据_id进行选择,这应该更容易,我想知道是否有更容易的方法来完成部分复制?

我需要编写这个脚本,所以理想情况下希望用curl命令完成。然而,如果这是完成任务的唯一方法,我可以使用node+nano脚本,或者安装另一个工具。

由于@RamblinRose在评论中的提示,这是由于没有转义"$regex"中的$。(这里的所有示例都使用bash转义。(

更改为"$regex"有效。但更简单的是,只使用单引号而不是双引号包装JSON,然后"$都不需要转义:

curl -H 'Content-Type: application/json' 
-d '{"selector":{"_id":{"$regex":"^(doc-|other-)"}}}' 
http://admin:PW@127.0.0.1:5984/mydb/_find

为了回答我的主要问题,这里是如何使用curl:设置过滤复制

export ADMINDB='http://admin:PASSWORD@127.0.0.1:5984'
curl -H 'Content-Type: application/json' 
-d '{"source": "'${ADMINDB}'/db_one", "target": "'${ADMINDB}'/db_two", "selector":{"_id":{"$regex":"^(doc-|other-)"}} "create_target": false, "continuous": false}' 
${ADMINDB}/_replicator 

注意:导出上的前导空格,因此密码不会进入bash历史。

注意:${ADMINDB}周围有单引号,因此变量插入可以工作,同时仍然可以使用单引号,而不必使用反斜杠。

注意:版本号从db_one延续到db_two,但我最终在已经存在的文档上遇到了冲突。

更严重的是,如果我编辑例如";doc-A";在dbtwo中,例如,将其从rev-72转换到rev-74,然后再次运行replicate命令,它不会被替换。甚至没有冲突。新数据保持在74版。如果我删除db_two中的文档,然后运行replicate命令,它们将在db_two中保持删除状态。

总之,这就是CouchDB方式。如果您只想将一些文档从一个数据库复制到另一个数据库,并在它们已经存在的情况下强制替换它们,这不是CouchDB的方式,您无法做到这一点(使用_replicate(。

最新更新