Flask-MongoEngine与PyMongo聚合查询
我正在尝试使用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 }
2 个回答
12
aggregate
从 Mongoengine 0.9 版本开始就可以使用了。
你可以查看这个 API 参考文档 来了解更多信息。
由于没有任何示例,这里给你介绍一下如何在 Mongoengine 0.9 及以上版本中使用聚合框架进行聚合查询。
pipeline = [
{ '$group' :
{ '_id' : { 'carrier' : '$carrierA', 'category' : '$category' },
'count' : { '$sum' : 1 }
}
}]
Model.objects().aggregate(*pipeline)
16
你用Mongoengine定义的类其实有一个叫做_get_collection()
的方法,这个方法可以获取到“原始”的集合对象,这个功能是由pymongo驱动实现的。
在这个例子中,我只是用Model
这个名字作为你实际定义的连接类的占位符:
Model._get_collection().aggregate([
{ '$group' :
{ '_id' : { 'carrier' : '$carrierA', 'category' : '$category' },
'count' : { '$sum' : 1 }
}
}
])
所以你可以随时访问pymongo的对象,而不需要单独建立连接。Mongoengine本身就是建立在pymongo之上的。