[英]With arangodb AQB how do you get out/inEdges an from/toVertices? in a query?
[英]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.like
是OLD.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.