Не удается вставить или обновить документ в ArangoDB с нарушением ограничения - PullRequest
0 голосов
/ 09 декабря 2018

Я бы хотел получить Upsert в ArangoDB, но не могу заставить его работать с примерами, приведенными в документации create-document .Мои запросы не выполняются с сообщением об ошибке unique constraint violated.

Я вставляю документ с определенным _key в коллекцию, а для параметра overwrite установлено значение true, как описано в документации,но я все еще получаю сообщения об ошибках.Вот результаты описанных вызовов curl в моей среде.

вызов №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

ответ №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---_"}

вызов № 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

ответ № 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}

Я просмотрел документацию, включил и просмотрел журналы сервера, но не могу понять.Любая помощь будет принята с благодарностью.

Редактировать 1:

На всякий случай, если это может помочь, я запускаю сервер ArangoDB локально с Docker со следующими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"

А вот лог с сервера:

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

1 Ответ

0 голосов
/ 09 декабря 2018

Я разместил этот вопрос на слабом канале сообщества ArangoDB, и хорошие люди там указали мне, что замена-вставка через параметр overwrite была введена только с 3.4.Исходя из моей композиции в Docker, мое изображение указывало на последнее изображение Официального репозитория Docker для arangodb , которое равно 3.3.20.

Мне объяснили, чтоэтот «официальный» репозиторий (arangodb) не обязательно содержит последнюю стабильную версию ArangoDB, и может пройти несколько дней, прежде чем он станет доступным, и вместо этого я должен указать на arangodb/arangodb.

Я адаптировал свойdocker-compose.yml файл, чтобы использовать правильное изображение, и теперь он работает нормально.

docker-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

Еще раз спасибо сообществу ArangoDBна Slack, а точнее на @mpoeter!

...