2016-12-12 24 views
2

の「未が存在する場合、」私はカスタムキーでアランゴ-DBに値を挿入したいが、私はSQLArangodb

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コマンドを見て、とだけそれにUPDATEためのコマンドと何のINSERT一部のための指示を与える程度。そうすれば、それが存在しなければ実行されます。ここ

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コマンドは3つのセクションを有しています。

最初はコンパイラで、ドキュメントが存在するかどうかを識別する方法です。この場合、比較者は{ username: @username }です。これを使用してUsersコレクションを検索し、一致するかどうかを確認します。

一致するものがなければ、INSERTコマンドを実行します。
一致するものがある場合は、UPDATEコマンドを実行します。

この場合、UPDATEコマンドでは何も提供されていないため、何も提供されていないため、何も更新されません。存在しない場合にのみ挿入されます。

ブロックブロックには、レコードが見つからない場合に挿入するキー/値が表示されます。

この場合、作成されたばかりの新規ユーザーが検証されないため、falseにも設定が検証されます。このフラグをtrueに変換するのは、アプリ内の別のコマンドの責任です。

RETURNのエントリにも注意してください。それはNEWを参照し、必要に応じてOLDというものを参照することもできます。

これらは、UPSERTコマンドによって提供される内部戻り値であり、参照された2つのバージョンのドキュメントを参照します。

NEWは、更新が行われたかどうかにかかわらず、常に最新のバージョンのドキュメントが格納されます。

OLDには、新しい値で更新される前の古いバージョンのドキュメントが含まれています。ドキュメントが更新されていない場合はnullを返します。この場合、更新が行われないため常にnullになります。

はい、これは他のデータベース言語のIF NOT EXISTSスタイルコマンドとまったく同じように実行されます。コンパレータが一致しない場合は、新しいレコードを挿入します。コンパレータが一致する場合は、何もしません。

私はそれが助けてくれることを願っています!

+0

サンプルクエリを作成することは可能ですか?オプションなしでは、私にとってはうまくいきません。 – ich

+0

ありがとう、私のreputatoinは低いupvoteにです:)私はそれを作ることができるとき、私はやります – ich

0

少し不満、Arangodbコミュニティは私を助けました。 "IF NOT EXITS"のようなクエリは存在しません。データベースシステムがこの場合は例外をスローしてクエリを使用可能にするため、無視するエラーメッセージダイアログを追加する必要があります。

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