2016-12-12 11 views
2

Я хочу, чтобы вставить значения в Аранго-DB с пользовательскими ключами, но я не нашел функцию «если не существует», как в SQL«Если не существует» на Arangodb

let exist = (
    FOR u IN User 
    FILTER u._key == "newkey" 
    return u 
) 
Filter LENGTH(exist)==null 
    INSERT{ 
     _key:    "newkey", 
     value1:    "value" 
    } IN User 
return NEW 

Что-то вроде этого также не работает

INSERT{ 
    _key:    "newkey", 
    value1:    "value" 
} 
IN User ON DUPLICATE KEY IGNORE 
return NEW 

ответ

2

Как насчет глядя на команду UPSERT, и только дать ему инструкции по INSERT части команды и ничего для UPDATE. Таким образом, это будет выполняться только в том случае, если оно не существует.

https://docs.arangodb.com/3.0.10/AQL/Operations/Upsert.html

Ниже приведен пример того, что используют:

UPSERT { 
    username: @username 
} 
INSERT { 
    username: @username, 
    fullname: @fullname, 
    verified: false 
} 
UPDATE { 
} 
IN Users 

RETURN { 
    user: NEW 
} 

UPSERT Команда состоит из трех частей к нему.

Первый - это сопоставитель, он определяет, существует ли документ или нет. В этом случае сравнитель { username: @username }. Он использует это для поиска коллекции Users, чтобы узнать, есть ли совпадение или нет.

Если нет совпадения, он выполняет команду INSERT.
Если есть соответствие, он выполняет команду UPDATE.

В этом случае мы были сложными и не предоставляли ничего для команды UPDATE, поэтому он ничего не обновит, если он существует, он будет только вставляться, если он не существует.

Затем блок INSERT показывает ключи/значения, которые он вставляет, если запись не найдена.

В этом случае он также устанавливается в false, поскольку новый пользователь, который только что был создан, не проверен. Ответственность другой команды в другом месте приложения заключается в том, чтобы преобразовать этот флаг в true.

Также обратите внимание на запись RETURN, она ссылается на NEW, и вы также можете обратиться к вещанию под названием OLD, если необходимо.

Это внутренние значения возврата, предоставляемые командой UPSERT, и они ссылаются на две версии документа, на которые были сделаны ссылки.

NEW всегда заполнен, он содержит самую последнюю версию документа, независимо от того, было сделано обновление или нет.

OLD содержит старую версию документа, прежде чем он будет обновлен новыми значениями. Если документ не обновляется, он возвращает null, поэтому в этом случае он всегда будет пустым, поскольку обновления не будут выполняться.

И да, это выполняется точно так же, как команда стиля IF NOT EXISTS на других языках баз данных. Если компаратор не соответствует, он вставляет новую запись, если компаратор соответствует, он ничего не делает!

Я надеюсь, что это поможет!

+0

Возможно ли, что вы можете создать образец запроса. Это не сработало для меня, без опций. – ich

+0

Спасибо, моя репутация должна быть низкой, чтобы возвысить :), когда я смогу это сделать, я сделаю – ich

0

его немного неудовлетворительно, сообщество Arangodb помогло мне. В нем нет такого запроса, как «ЕСЛИ НЕ ВЫХОДИТ», система базы данных бросает в этом случае exeption, чтобы сделать запрос пригодным для использования, вы должны добавить диалоговое окно с сообщением об ошибке игнорирования.

INSERT{ 
    _key:    "key", 
    value1:    "value" 
}in Users OPTIONS {ignoreErrors: true} 
return NEW 

 Смежные вопросы

  • Нет связанных вопросов^_^