我正在尝试使用flask-mongoengine进行聚合查询,从我所看到的内容听起来并不可能.
我查看了几个论坛主题,电子邮件链和Stack Overflow上的一些问题,但我还没有找到一个如何用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 }
Neil Lunn.. 14
您使用Mongoengine定义的类实际上有一个_get_collection()
方法可以获取pymongo驱动程序中实现的"原始"集合对象.
我只是在Model
这里使用名称作为占位符,为此示例中为连接定义的实际类:
Model._get_collection().aggregate([ { '$group' : { '_id' : { 'carrier' : '$carrierA', 'category' : '$category' }, 'count' : { '$sum' : 1 } } } ])
因此,您始终可以访问pymongo对象,而无需建立单独的连接.Mongoengine本身就是以pymongo为基础的.
您使用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)