Flask-MongoEngine和PyMongo聚合查询

 lily-SweetDream_828 发布于 2023-01-07 16:53

我正在尝试使用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为基础的.

2 个回答
  • 您使用Mongoengine定义的类实际上有一个_get_collection()方法可以获取pymongo驱动程序中实现的"原始"集合对象.

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

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

    因此,您始终可以访问pymongo对象,而无需建立单独的连接.Mongoengine本身就是以pymongo为基础的.

    2023-01-07 16:56 回答
  • aggregate自Mongoengine 0.9以来可用.链接到API参考.

    由于没有任何示例,以下是使用Mongoengine> 0.9的聚合框架执行聚合查询的方法

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

    2023-01-07 16:56 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有