简体   繁体   English

在ArangoDB中插入或更新文档失败,并违反了约束

[英]Insert or update a document in ArangoDB fails with constraint violated

I would like to achieve an Upsert in ArangoDB, but I can't get it working with the examples provided in the documentation of create-document . 我想在ArangoDB中实现Upsert,但是我无法通过create-document文档中提供的示例来使用它。 My requests fail with a unique constraint violated error message. 我的请求失败,并显示unique constraint violated错误消息。

I'm inserting a document with a specific _key in a collection, and the overwrite option set to true as described in the documentation, but I still get the error messages. 我正在集合中插入具有特定_key的文档,并且overwrite文档中说明的overwrite选项设置为true ,但仍然收到错误消息。 Here's the results of the described curl calls on my environment. 这是在我的环境中所描述的curl调用的结果。

call #1: 呼叫1:

curl -X POST --header 'accept: application/json'\
             --data-binary @- --dump - \
             http://localhost:8529/_api/document/products\?overwrite\=true \
<<EOF
{ "Hello": "Universe", "_key" : "lock" }
EOF

response #1: 回应1:

HTTP/1.1 202 Accepted
X-Content-Type-Options: nosniff
Location: /_db/_system/_api/document/products/lock
Etag: "_X28xHz---_"
Server: ArangoDB
Connection: Keep-Alive
Content-Type: application/json; charset=utf-8
Content-Length: 58  

{"_id":"products/lock","_key":"lock","_rev":"_X28xHz---_"}

call #2: (identique to the first one) 呼叫2 :( 与第一个相同)

curl -X POST --header 'accept: application/json'\
             --data-binary @- --dump - \
             http://localhost:8529/_api/document/products\?overwrite\=true \
<<EOF
{ "Hello": "Universe", "_key" : "lock" }
EOF

response #2: 回应2:

HTTP/1.1 409 Conflict
X-Content-Type-Options: nosniff
Server: ArangoDB
Connection: Keep-Alive
Content-Type: application/json; charset=utf-8
Content-Length: 153

{"error":true,"errorMessage":"unique constraint violated - in index 0 of type primary over [\"_key\"]; conflicting key: lock","code":409,"errorNum":1210}

I went through the documentation, I enabled and reviewed the server logs but I can't figure it out. 我浏览了文档,启用并查看了服务器日志,但无法弄清楚。 Any help would be highly appreciated. 任何帮助将不胜感激。

Edit 1: 编辑1:

Just in case, if this can be of any help, I run ArangoDB server locally with Docker with the following docker-compose 以防万一,如果有什么帮助,我可以在Docker本地运行ArangoDB服务器,并使用以下docker-compose

version: '3'
services:
  db:
    image: arangodb
    ports:
    - "8529:8529"
    environment:
      ARANGO_NO_AUTH: 1
    volumes:
      - ./arangodb3:/var/lib/arangodb3
    command: "--log.level startup=trace --log.level requests=trace --log.level info"

And here's the log from the server: 这是来自服务器的日志:

db_1  | 2018-12-09T08:56:16Z [1] DEBUG {requests} "http-request-begin","0x7f51ac946010","172.20.0.1","POST","HTTP/1.1","/_api/document/products?overwrite=true"
db_1  | 2018-12-09T08:56:16Z [1] TRACE {requests} "http-request-body","0x7f51ac946010","{ \"Hello\": \"Universe\", \"_key\" : \"lock\" }\n"
db_1  | 2018-12-09T08:56:16Z [1] TRACE {requests} "http-request-response","0x7f51ac946010","/_api/document/products?overwrite=true","HTTP\/1.1 409 Conflict\r\nX-Content-Type-Options: nosniff\r\nServer: ArangoDB\r\nConnection: Keep-Alive\r\nContent-Type: application\/json; charset=utf-8\r\nContent-Length: 153\r\n\r\n{\"error\":true,\"errorMessage\":\"unique constraint violated - in index 0 of type primary over [\\\"_key\\\"]; conflicting key: lock\",\"code\":409,\"errorNum\":1210}"
db_1  | 2018-12-09T08:56:16Z [1] TRACE {requests} "http-request-statistics","0x7f51ac946010","172.20.0.1","POST","HTTP/1.1",409,41,153,"/_api/document/products?overwrite=true",read,0.000124931,queue,0.000000000,queue-size,0,request,0.000008106,total,0.017638445,error,false
db_1  | 2018-12-09T08:56:16Z [1] INFO {requests} "http-request-end","0x7f51ac946010","172.20.0.1","POST","HTTP/1.1",409,41,153,"/_api/document/products?overwrite=true",0.017630

I posted this question on the slack channel of the ArangoDB community, and the fine people there pointed to me that the replace-insert via the overwrite parameter was introduced only since in 3.4 . 我在ArangoDB社区的闲散通道上发布了这个问题,那里的好人向我指出,仅在3.4以来才引入了通过overwrite参数进行的替换插入。 Based on my docker compose, my image was pointing the the latest image of the Official Docker Repository for arangodb , which is 3.3.20 . 基于我的docker compose,我的图像指向arangodb官方Docker仓库的最新图像,即3.3.20

I was explained that this "official" repository ( arangodb ) is not necessarily hosting the latest stable version of ArangoDB, and it can take days before it gets available, and I should instead point to arangodb/arangodb . 有人向我解释说,这个“官方”存储库( arangodb )不一定托管arangodb的最新稳定版本,它可能需要几天的时间才能提供,我应该指向arangodb/arangodb

I adapted my docker-compose.yml file to use the right image, and now it works fine. 我修改了docker-compose.yml文件以使用正确的图像,现在它可以正常工作。

docker-compose.yml: 泊坞窗,compose.yml:

version: '3'
services:
  db:
    image: arangodb/arangodb:3.4.0
    ports:
    - "8529:8529"
    environment:
      ARANGO_NO_AUTH: 1
    volumes:
      - ./arangodb3:/var/lib/arangodb3

Thank you again to the ArangoDB Community on Slack, and more particularly to @mpoeter! 再次感谢您在Slack上的ArangoDB社区,尤其是@mpoeter!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM