ArangoDB AQL Upsert如何将值推送到列表中

时间:2017-05-24 22:18:36

标签: arangodb aql

尝试在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)}在token_category中

1 个答案:

答案 0 :(得分:0)

此处使用的语言是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-Syntax混合使用,这不受支持。