ArangoDB AQL Upsert, как вставить значение в список

Попытка использовать UPSERT в AQL и успешна, пока мне не нужно вставить значение в массив списка (и мне также нужно проверить, существует ли оно, хотя я думаю, что оно у меня есть)

Код

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


person RHSMan    schedule 24.05.2017    source источник
comment
Кажется, это не просто обычный запрос AQL, я правильно понимаю, что это строка, которую вы используете в сочетании с другим языком программирования, чтобы вставлять в нее переменные? Какой язык вы используете?   -  person cake    schedule 25.05.2017
comment
Дополнительное примечание: вы на самом деле знаете, что AQL поддерживает то, что называется «параметрами привязки», что позволяет вам объявлять все ваши переменные в одном месте, а затем использовать @имя-переменной внутри вашего запроса, чтобы автоматически помещать значения вы объявили в одном месте, обратно в этот запрос, верно?   -  person cake    schedule 25.05.2017
comment
Спасибо, это AQL db_query от микросервиса foxx (javascript). Спасибо за совет по связыванию переменных.   -  person RHSMan    schedule 29.05.2017


Ответы (1)


Здесь используется язык Javascript. Упрощение запроса, используемого здесь:

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

на самом деле использует специальную строку шаблона AQL для создания привязки ценности. Чтобы разобрать то, что на самом деле передано 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, который не поддерживается.

person dothebart    schedule 27.02.2019