arangodb - 更新 ArangoDB 子文档

标签 arangodb

我目前正在评估 ArangoDB 是否可以成为我们 future 的替代方案。作为本次评估的一部分,我将把与我们当前的 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”)开头的属性也可能是一个问题等。虽然找到了一个示例 here对于我想做的事情来说,这似乎有点复杂和令人费解。还有另一个讨论here这与我想做的很接近。但是,该讨论中提出的解决方案使用关键字 OLD 在我的情况下会产生错误,并且代码会替换“0”中的所有键。

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

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

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

4) 我可以将参数绑定(bind)到属性吗?例如让某些 @attributesubdoc.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" 
]

使用绑定(bind)变量 - 不起作用:

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)

使用绑定(bind)变量 - 已修复:

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

[ 
  "abc" 
]

关于arangodb - 更新 ArangoDB 子文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40397726/

相关文章:

ArangoDB Windows 空闲 CPU 负载

阿兰戈DB : How to get all the possible paths between 2 vertices?

arangodb - 如何处理 ArangoDB/AQL 中的过期数据

arangodb - AQL : return minimum of two values

rest - 是否有一个图数据库可以自动为每个节点生成静态端点?

java - 使用Java在ArangoDB中查询边缘抛出Gson异常

ArangoDb AQL Graph查询遍历示例

lastinsertid - 上次使用 AQL 在 ArangoDB 中插入 _key?

mongodb - 将 mongoDB 转储导入 arangoDB

random - 在ArangoDB中随机选择一个文档