PyMongo 不返回聚合结果

Posted

技术标签:

【中文标题】PyMongo 不返回聚合结果【英文标题】:PyMongo not returning results on aggregation 【发布时间】:2021-12-06 13:38:40 【问题描述】:

我是 PyMongo 的初学者。我正在尝试查找多次注册的活动。此代码返回一个空列表。你能帮我找出错误吗:

rows = self.db.Activity.aggregate( [
    
     '$group': 
        "_id": 
            
                "user_id": "$user_id",  
                "transportation_mode": "$transportation_mode", 
                "start_date_time": "$start_date_time",
                "end_date_time": "$end_date_time"
            ,           
        "count": '$sum':1
        
    ,
    
    '$match': 
         "count":  '$gt': 1  
    ,
    
    '$project': 
        "_id":0,
        "user_id":"_id.user_id", 
        "transportation_mode":"_id.transportation_mode",  
        "start_date_time":"_id.start_date_time",
        "end_date_time":"_id.end_date_time",
        "count": 1

        
    
    ]
    )

来自 db 的 5 行:

 "_id" : 0, "user_id" : "000", "start_date_time" : "2008-10-23 02:53:04", "end_date_time" : "2008-10-23 11:11:12" 

 "_id" : 1, "user_id" : "000", "start_date_time" : "2008-10-24 02:09:59", "end_date_time" : "2008-10-24 02:47:06" 

 "_id" : 2, "user_id" : "000", "start_date_time" : "2008-10-26 13:44:07", "end_date_time" : "2008-10-26 15:04:07" 

 "_id" : 3, "user_id" : "000", "start_date_time" : "2008-10-27 11:54:49", "end_date_time" : "2008-10-27 12:05:54" 

 "_id" : 4, "user_id" : "000", "start_date_time" : "2008-10-28 00:38:26", "end_date_time" : "2008-10-28 05:03:42" 

谢谢

【问题讨论】:

请分享来自Activity收藏的一些示例源文档 已从源添加了 5 行 _id 查询中的 _id 字段错误。我认为只有user_id 应该出现在$group 阶段的_id 字段中 【参考方案1】:

您的组标准可能过于狭窄。

$group 阶段将为_id 字段的每个不同值创建一个单独的输出文档。如果它们在所有四个字段中具有完全相同的值,则问题中的管道将仅包含同一组中的两个输入文档。

为了使计数大于 1,必须存在 2 个具有相同用户、模式以及完全相同的开始和结束的文档。

在您显示的相同数据中,没有两个文档属于同一组,因此 $group 阶段的所有输出文档的计数均为1,因此它们都不满足$match,返回的是一个空列表。

【讨论】:

【参考方案2】:

当您在$project 阶段传递_id: 0 时,即使在后续投影中也不会投影子对象,因为规则被覆盖。

试试下面的$project 阶段。


  '$project': 
    "user_id":"_id.user_id", 
    "transportation_mode":"_id.transportation_mode",  
    "start_date_time":"_id.start_date_time",
    "end_date_time":"_id.end_date_time",
    "count": 1
  

rows = self.db.Activity.aggregate( [
  
    '$group':
      "_id": 
        "user_id": "$user_id",  
        "transportation_mode": "$transportation_mode", 
        "start_date_time": "$start_date_time",
        "end_date_time": "$end_date_time"
        ,           
      "count": '$sum':1
      
  ,
  
    '$match':
      "count":  '$gt': 1 
    
  ,
  
    '$project': 
      "user_id":"_id.user_id", 
      "transportation_mode":"_id.transportation_mode",  
      "start_date_time":"_id.start_date_time",
      "end_date_time":"_id.end_date_time",
      "count": 1,
    
  
])

【讨论】:

这不起作用 @MichaelMaier,根据您的示例输入,count 键永远不会大于 1。看看@Joe 的答案。请详细说明您要通过逻辑和条件实现的目标 已更新问题

以上是关于PyMongo 不返回聚合结果的主要内容,如果未能解决你的问题,请参考以下文章

pymongo中带有forEach函数的Mongo聚合查询不起作用

pymongo.errors.DocumentTooLarge:“聚合”命令文档太大

pymongo 查询未在烧瓶中返回任何内容

Pymongo 中的聚合函数

PyMongo 聚合不适用于 $max 运算符

当数据非常嵌套时如何使用 $gt 聚合文档和聚合 Pymongo