我目前正在评估ArangoDB是否可以成为我们未来的替代方案 . 作为评估的一部分,我将代码与我们当前的NoSQL数据库移植到代表ArangoDB的代码中 . 虽然到目前为止这是一个相当平稳的旅程,但我很难在如何更新子文档方面解决这个问题 . 假设我们有这样的事情:
{
"_key": "12345",
"subdoc": {
"0": {
"num_sold": 6,
"other_attribute": "important"
},
"1": {
"num_sold": 4,
"other_attribute": "important"
}
}
}
What I would like to accomplish now it to atomically increase 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)我可以将参数绑定到属性吗?比如让一些 @attribute
是 subdoc.0.num_sold
?
谢谢!
1 回答
如果您使用点表示法中的数字,ArangoDB无法解析查询 . 然而,有一种简单的方法 - 只需使用括号而不是点符号 .
示例 - 不工作:
示例 - 修复:
使用绑定变量 - 不工作:
使用绑定变量 - 修复: