使用 JSONiq 插入 JSON

Insert into JSON using JSONiq

我们正在编写 JSONiq 查询以将新属性插入 JSON 和 return 从查询中更新的 JSON。

查询:

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 中所述文档 here

我们遇到以下异常:

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

问题:

  1. 查询是否正确?如果不是,如何使其正确 syntactically/logically ?
  2. 是否有关于 JSONiq 的在线资源和示例?

这是使其工作的方法json 使用 JSONiq 进行更新。我们需要使用 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

希望这可能对某人有所帮助

这里有更多的解释:

JSONiq 更新的工作方式与 XQuery 更新的工作方式相同。 JSONiq updates are declarative: 一个JSONiq update program returns,除了数据模型中的一个空序列,什么叫做待定更新列表 (PUL),这是要应用于某些文档的更新列表(删除、替换、重命名、插入等)。

JSONiq update 具有快照语义,这意味着 没有副作用 在主表达式求值期间发生。相反,在计算出 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 returned 包含针对内存中动态创建的 JSON 对象的更改。该对象的生命周期只是对查询求值的生命周期,因此该程序根本没有可见的效果。

如果 collection 函数以某种方式映射到 Couchbase 或 MongoDB 等文档存储中的数据库(也就是说,如果引擎已记录并配置为执行此操作),则以下查询将在语义上将更新应用于此文档存储。

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

A copy-modify-return 表达式(在 XQuery 中也称为转换表达式,请参阅本页上的其他答案)提供了一种在内存中应用更改的方法而不会丢失它们,也没有任何持久存储。它:

  • 创建一个 JSON 对象(作为另一个的 copy),或一个 XML 节点等
  • 通过应用从 modify 表达式获得的 PUL 修改该对象(重要:这没有可见的副作用,因为只修改了一个副本)
  • return修改后的副本。

对于高级用户:在这种情况下,复制子句包含一个构建新对象的构造函数,因此优化器实际上可以跳过复制。