关于python:Flask-MongoEngine和PyMongo聚合查询

Flask-MongoEngine & PyMongo Aggregation Query

我正在尝试使用flask-mongoengine进行聚合查询,从我阅读的内容来看,这听起来似乎是不可能的。

我查看了几个论坛线程,电子邮件链和有关Stack Overflow的几个问题,但是我还没有找到一个很好的例子来说明如何使用flask-mongoengine实现聚合。

这个问题有一条评论,说您必须使用"原始pymongo和聚合功能"。但是,没有任何示例说明其工作方式。我已经修改过P??ython,并使用Flask框架构建了一个基本应用程序,但是深入研究成熟的应用程序以及对Mongo的连接/查询对我来说是很新的。

有人可以提供一个示例(或链接到示例),说明我如何利用我的flask-mongoengine模型,但可以使用带有PyMongo的聚合框架进行查询吗?
这是否需要两个到MongoDB的连接(一个用于PyMongo来执行聚合查询,另一个用于通过MongoEngine进行常规查询/插入/更新)?

我想执行的聚合查询示例如下(此查询为我提供了我想要的Mongo shell信息):

1
2
3
4
5
6
7
db.entry.aggregate([
    { '$group' :
        { '_id' : { 'carrier' : '$carrierA', 'category' : '$category' },
          'count' : { '$sum' : 1 }
        }
    }
])

此查询的输出示例:

1
2
3
4
{"_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 }

您使用Mongoengine定义的类实际上具有_get_collection()方法,该方法获取pymongo驱动程序中实现的"原始"集合对象。

我只是在这里使用名称Model作为在此示例中为连接定义的实际类的占位符:

1
2
3
4
5
6
7
Model._get_collection().aggregate([
    { '$group' :
        { '_id' : { 'carrier' : '$carrierA', 'category' : '$category' },
          'count' : { '$sum' : 1 }
        }
    }
])

因此,您始终可以在不建立单独连接的情况下访问pymongo对象。 Mongoengine本身是建立在pymongo之上的。


aggregate自Mongoengine 0.9起可用。
链接到API参考。

由于周围没有任何示例,因此这里是如何使用Mongoengine> 0.9的聚合框架执行聚合查询的方法

1
2
3
4
5
6
7
8
pipeline = [
  { '$group' :
    { '_id' : { 'carrier' : '$carrierA', 'category' : '$category' },
      'count' : { '$sum' : 1 }
    }
  }]

Model.objects().aggregate(*pipeline)