使用JSONiq插入JSON
我们正在编写一个JSONiq查询,将新属性插入JSON并从查询返回更新的JSON使用JSONiq插入JSON,json,zorba,jsoniq,Json,Zorba,Jsoniq,我们正在编写一个JSONiq查询,将新属性插入JSON并从查询返回更新的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"
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 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
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
users
保存输入json,我们正试图使用JSONiq insert命令添加一个属性,如JSONiq文档中所述
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
我们得到以下例外:
java.lang.RuntimeException: (no URI):13,1: static error [err:XPST0003]: invalid expression: syntax error, unexpected expression (missing comma "," between expressions?)
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 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
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实现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
希望这可能对某些人有所帮助以下是一些更多的解释:
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更新是声明性的:JSONiq更新程序除了返回数据模型中的空序列外,还返回一个被称为“待更新列表”(PUL),它是应用于某些文档的更新(删除、替换、重命名、插入等)列表
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更新具有快照语义,这意味着在对主表达式求值期间,没有副作用。相反,在计算PUL后,引擎可能会将PUL指定的更改传播到底层存储(例如磁盘上的文件或文档存储)
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 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 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对象的更改。该对象的生存期仅为查询的评估期,因此该程序没有明显的效果
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
如果collection
函数以某种方式映射到文档存储(如Couchbase或MongoDB)中的数据库(即,如果引擎被记录并配置为执行此操作),则以下查询将在语义上对此文档存储应用更新
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 version "1.0";
let $users := collection("users")[$$.name eq "Jim"]
return insert json {"status" : "credit card declined"} into $users
复制修改返回表达式(在XQuery中也称为transform表达式,参见本页的其他答案)提供了一种在内存中应用更改的方法,而不会丢失更改,也不会有任何持久存储。它:
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
- 创建JSON对象(作为另一个对象的副本)或XML节点等
- 通过应用从修改表达式获得的PUL修改该对象(重要提示:这没有明显的副作用,因为只修改了一个副本)
- 返回修改后的副本
对于高级用户:在这种情况下,copy子句包含一个构建新对象的构造函数,因此优化器实际上可以跳过复制。它说错误在第13行。这是哪一行?最后一行返回$users应该有一个
代码>在前一行的末尾?(也可能是之前的一行。)尝试了,但得到了意想不到的语法错误“
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