Flask-MongoEngine & PyMongo Aggregation Query



我正在尝试使用flask-mongoengine进行聚合查询,并且从我所读到的听起来不像是可能的。

我看了几个论坛的线程,电子邮件链和堆栈溢出的一些问题,但我没有找到一个真正好的例子,如何实现聚合flask-mongoengine

这个问题中有一条评论说你必须使用"原始pymongo和聚合功能"。然而,没有例子说明这是如何工作的。我已经使用了Python,并使用Flask框架开发了一个基本的应用程序,但要深入研究成熟的应用程序。连接/查询Mongo对我来说很新鲜。

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

我想执行的聚合查询的一个示例如下(这个查询得到我在Mongo shell中想要的确切信息):

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 }

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

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

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

因此您总是可以访问pymongo对象,而无需建立单独的连接。

aggregate从Mongoengine 0.9开始可用。链接到API参考。

由于没有任何例子,这里是如何使用聚合框架执行聚合查询与Mongoengine> 0.9

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

最新更新