我们正在编写一个JSONiq查询,将新属性插入到JSON中,并从查询中返回更新的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 $usersusers保存输入json,我们正在尝试使用JSONiq插入命令添加另一个属性,如JSONiq文档这里中所提到的
我们正处于例外状态:
java.lang.RuntimeException: (no URI):13,1: static error [err:XPST0003]: invalid expression: syntax error, unexpected expression (missing comma "," between expressions?)问题:
发布于 2016-12-23 11:04:42
以下是更多的解释:
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复制-修改-返回表达式(在XQuery中也称为transform表达式,请参阅本页上的其他答案)提供了一种在内存中应用更改而不丢失它们和没有任何持久存储的方法。它:
对于高级用户:在本例中,copy子句包含一个构建新对象的构造函数,因此优化器实际上可以跳过复制。
发布于 2016-12-23 05:03:11
这是使用JSONiq进行json更新的方法。我们需要使用复制-修改-返回条款:
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希望这对某人有帮助
https://stackoverflow.com/questions/41266911
复制相似问题