【问题标题】:Updating ArangoDB sub document更新 ArangoDB 子文档
【发布时间】:2016-11-03 09:19:10
【问题描述】:

我目前正在评估 ArangoDB 是否可以成为我们未来的替代方案。作为本次评估的一部分,我将与我们当前的 NoSQL 数据库对话的代码移植到与 ArangoDB 对话的代码中。虽然到目前为止进展相当顺利,但对于如何更新子文档,我却出奇地难以理解。假设我们有这样的事情:

{
    "_key": "12345",
    "subdoc": {
        "0": {
            "num_sold": 6,
            "other_attribute": "important"

     },
        "1": {
            "num_sold": 4,
            "other_attribute": "important"
     }
    }
}

我现在想完成的是原子增加num_sold

第一个天真的方法当然是尝试类似的方法:

FOR d in @@collection
   FILTER d._key == "12345"
   UPDATE d WITH { subdoc.0.num_sold : subdoc.0.num_sold + 1 } IN @@collection
RETURN d

(对于复制粘贴的剧透警告:继续前进。这个 sn-p 只会让你的生活变得悲惨。)

这显然不起作用,而且很可能有多个原因。 Arango 似乎不喜欢我使用点符号来引用属性,以数字(“0”)开头的属性也可能是一个问题等。虽然找到了一个例子 here 它似乎有点复杂和令人费解的是什么我正在努力做。还有另一个讨论here,这与我想做的很接近。但是,该讨论中提出的解决方案使用了关键字OLD,这在我的情况下会产生错误,并且代码替换了“0”中的所有键。

1) 原子增加num_sold 的最佳方法是什么?

2) 什么时候是原子操作? (尽量远离交易)

3) 点记法什么时候可以用,什么时候不能用?

4) 我可以将参数绑定到属性吗?例如让一些@attribute 成为subdoc.0.num_sold

谢谢!

【问题讨论】:

    标签: arangodb


    【解决方案1】:

    如果您在点符号中使用数字,ArangoDB 将无法解析查询。 然而,有一个简单的方法 - 只需使用方括号而不是像您所做的那样使用点符号。

    示例 - 不工作:

    db._query(`
      LET testdoc = {subdoc: {"0": "abc"}}
         RETURN testdoc.subdoc.0`)
    
    ArangoError 1501: syntax error, unexpected integer number, 
    expecting identifier or bind parameter near '0' at
    position 1:60 (while parsing)
    

    示例 - 已修复:

    db._query(`
      LET testdoc = {subdoc: {"0": "abc"}}
         RETURN testdoc.subdoc.[0]`)
    
    [ 
      "abc" 
    ]
    

    使用绑定变量 - 不起作用:

    db._query(`
      LET testdoc = {subdoc: {"0": "abc"}}
         RETURN testdoc.subdoc.@bv`, {bv: 0})
    
    ArangoError 1501: syntax error, unexpected integer number, 
    expecting identifier or bind parameter near '0' at 
    position 1:60 (while parsing)
    

    使用绑定变量 - 固定:

    db._query(`
      LET testdoc = {subdoc: {"0": "abc"}}
         RETURN testdoc.subdoc.[@bv]`, {bv:0})
    
    [ 
      "abc" 
    ]
    

    【讨论】:

      猜你喜欢
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-26
      • 2011-08-04
      • 2020-06-30
      • 2014-10-24
      • 1970-01-01
      相关资源
      最近更新 更多