首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ArangoDB -如何在使用AQB的upsert语句中引用refer

ArangoDB -如何在使用AQB的upsert语句中引用refer
EN

Stack Overflow用户
提问于 2015-08-18 16:27:33
回答 2查看 261关注 0票数 1

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

代码语言:javascript
复制
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?

代码语言:javascript
复制
...
.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")
...
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-19 14:53:48

这实际上与UPSERT无关。问题在于您在JavaScript中使用加号运算符,它试图将表达式aqb.get('OLD', aqb.ref('like'))转换为字符串并将'1'附加到其中。在JS中,操作员不能超载,所以AQB不能阻止您这样做。

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

代码语言:javascript
复制
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.like是AQB中一个有效的简单引用,因此您可以简单地使用aqb.ref('OLD.like').add(1)。或者可以通过直接使用add函数来进一步简化它:aqb.add('OLD.like', 1)。所有这些都是语义等价的,并且应该生成语义上等效(如果不是完全相同)的AQL。下面是最后一个示例生成的AQL:

代码语言:javascript
复制
UPSERT {_from: @uid, _to: t._id}
INSERT {_from: @uid, to: t._id, like: 1}
UPDATE {like: (`OLD`.like + 1)}
IN edge
票数 2
EN

Stack Overflow用户

发布于 2015-08-19 14:57:06

据我所知,这是可以做到的:

代码语言:javascript
复制
/* 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查询

代码语言:javascript
复制
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`

希望这就是你要找的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32077804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档