使用 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?)
问题:
- 查询是否正确?如果不是,如何使其正确 syntactically/logically ?
- 是否有关于 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修改后的副本。
对于高级用户:在这种情况下,复制子句包含一个构建新对象的构造函数,因此优化器实际上可以跳过复制。
我们正在编写 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?)
问题:
- 查询是否正确?如果不是,如何使其正确 syntactically/logically ?
- 是否有关于 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修改后的副本。
对于高级用户:在这种情况下,复制子句包含一个构建新对象的构造函数,因此优化器实际上可以跳过复制。