#python #mongodb #eve
#python #mongodb #eve
Вопрос:
Я пытаюсь вызвать конвейер агрегации с параметрами как часть моего серверного кода в eve.
Документация и код на [github]https://github.com/pyeve/eve/blob/master/eve/methods/get.py#L122 предполагает, что я должен иметь возможность вызывать конвейер с помощью get_internal, и он должен выполняться с переданными ему параметрами.
Я пытался
get_internal("pipeline", **{'_id': id, 'time': time})
но похоже, что параметры _id и time не передаются в агрегированный запрос.
Я убедился, что конвейер работает, посетив URL-адрес конвейера
<baseurl>?aggregate={"_id":"5fa904807d3037e78023a5192,"time":1604827480260}
но я бы предпочел вызывать его из кода на стороне сервера, а не делать запрос, если это возможно.
Есть ли что-то очевидное, что я здесь делаю неправильно.
Спасибо
Ответ №1:
К сожалению, вы не можете использовать параметры с get_internal
агрегацией и . _perform_aggregation
использует только неизменяемый объект запроса при _perform_find
слиянии where
объекта запроса с вашими lookup
параметрами с $and
помощью .
Вы могли бы выполнить http-запрос к URL-адресу, как показано на рисунке, или вы могли бы использовать app.data.driver
и вручную выполнить запрос агрегации, импортировав конвейер и изменив его вручную:
from Flask import current_app as app
from domain.yourcollection import my_eve_aggregation # Import the aggregation definition
# Get the aggregation pipeline
pipeline = my_eve_aggregation['datasource']['aggregation']['pipeline']
# Replace parameters - you need to manually replace the correct stages
pipeline[0]['$match'] = {'_id':'5fa904807d3037e78023a5192','time':1604827480260}
# Get the mongo collection
datasource = my_eve_aggregation['datasource']['source']
# Set db collection
col = app.data.driver.db[datasource]
result = list(col.aggregate(pipeline))
И, пожалуйста, создайте проблему в https://github.com/pyeve/eve/issues для этой отсутствующей функции