繁体   English   中英

更新 ArangoDB 子文档

[英]Updating ArangoDB sub document

我目前正在评估 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

(剧透警告那里的复制粘贴者:继续前进。这个片段只会让你的生活变得悲惨。)

这显然不起作用,而且很可能有不止一个原因。 Arango 似乎不喜欢我使用点符号引用属性,以数字(“0”)开头的属性也可能是一个问题等。虽然在这里找到了一个例子但对于我的情况似乎有点复杂和令人费解试图做。 也有另一种讨论这里是接近我想要做什么。 但是,该讨论中建议的解决方案使用关键字OLD在我的情况下创建错误以及替换“0”中所有键的代码。

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

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

3)点符号什么时候可以用,什么时候不能用?

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

谢谢!

如果您在点表示法中使用数字,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" 
]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM