Фон: (с использованием Евы и Монго)
Я работаю в Python, используя подключение к библиотеке поставщика Eve REST и к mongoDB, чтобы предоставить ряд конечных точек REST из базы данных. До сих пор мне повезло с Евой, но я столкнулся с проблемой, которая может быть немного выше того, что Ева может делать изначально.
Моя проблема в том, что в моем формате документа mongoDb есть поле (называемое «слотами»), значение которого представляет собой список / массив словарей / встроенных документов.
Итак, структура документа mongoDB:
{
blah1: data1,
blah2: data2,
...
slots: [
{thing1:data1, thing2:data2},
{thingX:dataX, thingY:dataY}
]
}
Мне нужно добавить новые записи (например, добавить предварительно заполненные словари) в список «слотов».
Если я представлю, как вставить вставку напрямую через pymongo, это будет выглядеть так:
mongo.connection = MongoClient()
mongo.db = mongo.connection['myDB']
mongo.coll = mongo.db['myCollection']
...
mongo.coll.update({'_id' : document_id},
{'$push': { "slot" : {"thing1":"data1","thingX":"dataX"} } } )
Комбинация действий REST / URI, которую я хотел бы выполнить для этого действия, представляет собой POST
на '_id / slots', например URI /app/012345678901234567890123/slots
.
Проблема: (вставка элемента в массив в Eve)
Из SO: Как добавить к типу списка в Python Eve без замены старых значений и eve project issue похоже, что Ева в настоящее время не поддерживает работу со встроенными документами mongoDB (или массивами?), если только весь встроенный документ не будет перезаписан, а перезапись всего массива в моем случае очень нежелательна.
Итак, если предположить, что у ее истинной Евы нет метода, позволяющего вставлять элементы массива (и учитывая, что у меня уже есть множество других конечных точек, хорошо работающих внутри Евы) ...
... Сейчас я ищу способ внутри конфигурации Eve / Flask с несколькими рабочими конечными точками перехватить и изменить запись mongoDB Евы только для этой одной конечной точки.
Я знаю (худший случай), что могу переопределить маршрутизацию Евы и полностью выполнить запись вручную, но тогда мне пришлось бы управлять _updated
, проверять вручную и изменять значение _etag
документов, и я бы, конечно, предпочел бы не делать этого. напишите новый код для.
Я просмотрел перехватчики событий базы данных Евы, но не увидеть способ изменения выполняемых команд базы данных (я вижу, как изменить данные, но не команды).
Кто-нибудь еще уже решил эту проблему? Если нет идей по самому прямому пути для реализации вручную? (надеюсь повторно использовать как можно больше Eve, потому что я хочу продолжать использовать Eve для всех моих (уже работающих) конечных точек)