簡體   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