Запрос агрегации Flask-MongoEngine и PyMongo

Я пытаюсь сделать запрос агрегации с помощью flask-mongoengine, и из того, что я прочитал, не похоже, что это возможно.

Я просмотрел несколько веток форума, цепочек электронной почты и несколько вопросов о переполнении стека, но я не нашел действительно хорошего примера того, как реализовать агрегирование с помощью flask-mongoengine.

В этом вопросе есть комментарий, в котором говорится, что вы должны использовать "сырую функциональность пимонго и агрегирования". Тем не менее, нет примеров того, как это может работать. Я работал с Python и у меня есть базовое приложение, использующее инфраструктуру Flask, но изучение полноценных приложений и подключение / запросы к Mongo для меня довольно новое.

Может ли кто-нибудь предоставить пример (или ссылку на пример) того, как я мог бы использовать свои модели flask-mongoengine, но запрашивать с использованием инфраструктуры агрегирования с PyMongo? Потребуются ли для этого два подключения к MongoDB (одно для PyMongo для выполнения запроса агрегации, а второе для обычного запроса / вставки / обновления через MongoEngine)?

Пример запроса агрегации, который я хотел бы выполнить, выглядит следующим образом (этот запрос дает мне именно ту информацию, которую я хочу получить в оболочке Mongo):

db.entry.aggregate([
    { '$group' : 
        { '_id' : { 'carrier' : '$carrierA', 'category' : '$category' }, 
          'count' : { '$sum' : 1 }
        }
    }
])

Пример вывода из этого запроса:

{ "_id" : { "carrier" : "Carrier 1", "category" : "XYZ" }, "count" : 2 }
{ "_id" : { "carrier" : "Carrier 1", "category" : "ABC" }, "count" : 4 }
{ "_id" : { "carrier" : "Carrier 2", "category" : "XYZ" }, "count" : 31 }
{ "_id" : { "carrier" : "Carrier 2", "category" : "ABC" }, "count" : 6 }

2 ответа

Решение

Класс, который вы определяете с помощью Mongoengine, на самом деле имеет _get_collection() метод, который получает "сырой" объект коллекции, реализованный в драйвере pymongo.

Я просто использую имя Model здесь в качестве заполнителя для вашего фактического класса, определенного для соединения в этом примере:

Model._get_collection().aggregate([
    { '$group' : 
        { '_id' : { 'carrier' : '$carrierA', 'category' : '$category' }, 
          'count' : { '$sum' : 1 }
        }
    }
])

Таким образом, вы всегда можете получить доступ к объектам pymongo, не устанавливая отдельное соединение. Mongoengine сам по себе опирается на pymongo.

aggregate доступен с Mongoengine 0,9. Ссылка на API Ссылка.

Так как нет никакого примера, вот как вы выполняете агрегированный запрос с использованием структуры агрегации с Mongoengine > 0,9

pipeline = [
  { '$group' : 
    { '_id' : { 'carrier' : '$carrierA', 'category' : '$category' }, 
      'count' : { '$sum' : 1 }
    }
  }]

Model.objects().aggregate(*pipeline)
Другие вопросы по тегам