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聚合查询不起作用