1

新しいプロパティを JSON に挿入し、クエリから更新された JSON を返す JSONiq クエリを作成しています。

クエリ:

jsoniq version "1.0";
let $users := {
  "name" : "Deadbeat Jim",
  "address" : "1 E 161st St, Bronx, NY 10451",
  "risk tolerance" : "high"
} 
insert json {"status" : "credit card declined"} into $users
return $users

users入力 json を保持します。JSONiq ドキュメントで説明されているように、JSONiq insert コマンドを使用してもう 1 つのプロパティを追加しようとしています。

以下の例外が発生しています。

java.lang.RuntimeException: (no URI):13,1: static error [err:XPST0003]: invalid expression: syntax error, unexpected expression (missing comma "," between expressions?)

質問:

  1. クエリは正しいですか? そうでない場合、構文的/論理的に正しくする方法は?
  2. JSONiq についてオンラインで利用できる良いリソースと例はありますか?
4

2 に答える 2

1

これは、JSONiq を使用して json の更新を機能させる方法です。copy-modify-return 句を使用する必要があります。

jsoniq version "1.0";
copy $users := {
      "name" : "Deadbeat Jim",
      "address" : "1 E 161st St, Bronx, NY 10451",
      "risk tolerance" : "high"
} 
modify insert json {"status" : "credit card declined"} into $users
return $users

これが誰かに役立つことを願っています

于 2016-12-23T05:03:11.543 に答える
0

ここにいくつかの説明があります:

JSONiq の更新の仕組みは、XQuery の更新の仕組みと同じです。JSONiq 更新は宣言型です。JSONiq 更新プログラムは、データ モデル内の空のシーケンスに加えて、保留中の更新リスト (PUL)と呼ばれるものを返します。これは、更新 (削除、置換、名前変更、挿入など) のリストです。一部のドキュメントに適用されます。

JSONiq 更新にはスナップショット セマンティクスがあります。つまり、主な式の評価中に副作用は発生しません。代わりに、PUL が計算された、エンジンは PUL によって指定された変更を基になるストレージ (ディスク上のファイルやドキュメント ストアなど) に伝達する場合があります。

質問の例の構文的に正しいバージョンは次のようになります。

jsoniq version "1.0";
let $users := {
  "name" : "Deadbeat Jim",
  "address" : "1 E 161st St, Bronx, NY 10451",
  "risk tolerance" : "high"
} 
return insert json {"status" : "credit card declined"} into $users

ただし、この場合、返される PUL には、オンザフライでメモリ内に作成された JSON オブジェクトに対する変更が含まれています。このオブジェクトの存続期間は、クエリの評価の存続期間のみであるため、このプログラムは目に見える影響を与えません。

関数collectionが何らかの方法で Couchbase や MongoDB などのドキュメント ストア内のデータベースにマップされている場合 (つまり、エンジンが文書化され、これを行うように構成されている場合)、次のクエリは意味的にこのドキュメント ストアに更新を適用します。

jsoniq version "1.0";
let $users := collection("users")[$$.name eq "Jim"]
return insert json {"status" : "credit card declined"} into $users

copy-modify-return式 (XQueryのように変換式とも呼ばれます。このページの他の回答を参照してください) は、メモリ内の変更を失うことなく、永続ストレージなしで適用する方法を提供します。これ:

  • JSON オブジェクト (別のコピーとして)、または XML ノードなどを作成します。
  • 変更式から取得した PUL を適用してそのオブジェクトを変更します(重要: 変更されるのはコピーのみであるため、目に見える副作用はありません)。
  • 変更されたコピーを返します。

上級ユーザー向け: この場合、copy 句には新しいオブジェクトを構築するコンストラクターが含まれているため、オプティマイザーは実際にコピーをスキップできます。

于 2016-12-23T11:04:42.373 に答える