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 中使用了加号运算符,它试图将表达式 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
是 AQB 中的有效简单引用,因此您可以简单地使用 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`
希望这就是您要找的。
我想创建一个像这样的 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 中使用了加号运算符,它试图将表达式 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
是 AQB 中的有效简单引用,因此您可以简单地使用 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`
希望这就是您要找的。