繁体   English   中英

ArangoDB-如何使用AQB在upsert语句中引用OLD

[英]ArangoDB - How do you refer to OLD in an upsert statement using AQB

我想创建一个upsert语句,如下所示:

upsert {_from: @uid, _to: t._id}
insert { _from: @uid, _to: t._id, like: 1}
update {like: OLD.like+1}
in edge

使用AQB,如何将OLD.like引用为整数并以1递增?

...
.upsert({_from: '@uid', _to: "t._id"})                                                                                                                                                           
.insert({_from: '@uid', _to: 't._id', like:1})                                                                                                                                                   
.update({like: aqb.get('OLD', aqb.ref('like'))+1})                                                                                                                                               
.in("edge")
...

实际上,这与UPSERT无关。 问题是您在JavaScript中使用了plus运算符,该运算符试图将表达式aqb.get('OLD', aqb.ref('like'))转换为字符串并将其附加'1' 在JS中,运算符不能重载,因此AQB不能阻止您这样做。

正确的表达式是aqb.get('OLD', aqb.ref('like')).add(1) ,它会生成以下AQL:

UPSERT {_from: @uid, _to: t._id}
INSERT {_from: @uid, to: t._id, like: 1}
UPDATE {like: (`OLD`[like] + 1)}
IN edge

另请注意,这尝试将like作为变量用作属性名称。 那可能不是您想要的。 相反,您将使用aqb.str('like')或简单地使用aqb('like') (导致OLD["like"] )。

您实际上可以简化一点。 OLD.likeOLD.like中有效的简单引用,因此您可以简单地使用aqb.ref('OLD.like').add(1) 或者,您可以通过直接使用add函数进一步简化它: aqb.add('OLD.like', 1) 所有这些在语义上都是等效的,并且应该生成在语义上等效(如果不相同)的AQL。 这是最后一个示例生成的AQL:

UPSERT {_from: @uid, _to: t._id}
INSERT {_from: @uid, to: t._id, like: 1}
UPDATE {like: (`OLD`.like + 1)}
IN edge

据我所知,可以这样实现:

/* search values */
FROM = "v/1";
TO   = "v/2"; 

var qb = require("aqb"); 
q = qb.upsert({ _from: qb.str(FROM), _to: qb.str(TO) })
      .insert({ _from : qb.str(FROM), _to: qb.str(TO), like: 1 })
      .update({ like: qb.plus(qb.get("OLD", qb.str("like")), 1) })
      .in("edge")
      .returnOld("old"); 

/* to verify the generated AQL string */
print(q.toAQL());

这将构造以下AQL查询

UPSERT {_from: "v/1", _to: "v/2"} 
INSERT {_from: "v/1", _to: "v/2", like: 1} 
UPDATE {like: (`OLD`["like"] + 1)} IN edge 
LET `old` = OLD 
RETURN `old`

希望这是您想要的。

暂无
暂无

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

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