【问题标题】:ArangoDB AQL Upsert how to push a value into listArangoDB AQL Upsert 如何将值推送到列表中
【发布时间】:2019-02-28 00:16:29
【问题描述】:

尝试在 AQL 中使用 UPSERT 并成功,直到我需要将一个值推送到列表数组中(我还需要检查它是否存在,尽管我认为我有)

代码

const t_list_ = db._query(aql`
        UPSERT { token_name: ${token_i}, type: ${type}}
        INSERT { token_name: ${token_i},
                 type: ${type},
                 frequency: ${tokens[i].frequency},
                 user_list: [${req.pathParams.user_id}] }
        UPDATE { frequency: OLD.frequency + ${tokens[i].frequency},
                 user_list: OLD.user_list.push(${req.pathParams.user_id})}
             IN token_category
        RETURN { doc: NEW, type: OLD ? 'update' : 'insert' }`).toArray()

错误是:ArangoError: 语法错误,意外 (, 期望 } 靠近 '(@value3)} IN token_category

【问题讨论】:

  • 这似乎不仅仅是一个常规的 AQL 查询,我是否理解它是一个字符串,您正在与另一种编程语言结合使用,将变量推入?您使用什么语言?
  • 旁注:您确实知道 AQL 支持称为 'bind parameters' 的东西,它允许您在一个地方声明所有变量,然后使用 @variable-name在您的查询中自动将您声明的值放回该查询中,对吗?
  • 谢谢,它是来自 foxx 微服务 (javascript) 的 AQL db_query。感谢您提供有关绑定变量的提示。

标签: arangodb aql


【解决方案1】:

这里使用的语言是 Javascript。 简化这里使用的查询:

let foo="bar";
db._query(aql`RETURN ${foo}`).toArray()

实际上是使用a specialized AQL-Template string 来生成绑定值。要拆除实际交给db._query()的东西,我们可以使用JSON.stringify()

print(JSON.stringify(aql`RETURN ${foo}`))
{"query":"RETURN @value0","bindVars":{"value0":"bar"}}

在这里,您可以看到错误消息中该字符串的实际来源:@value3 实际上是您插入到模板中的表达式之一的绑定变量。

所以语法错误的实际问题是这一行:

        UPDATE { frequency: OLD.frequency + ${tokens[i].frequency},
                 user_list: OLD.user_list.push(${req.pathParams.user_id})}

在这里,您将 AQL 语法与 Javascript 语法混合在一起,这是不受支持的。

【讨论】:

    猜你喜欢
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多