使用JSONiq插入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查询,将新属性插入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"} 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的好的在线资源和例子

  • 这是使用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