在烧瓶 mongoDB 中加入集合的 groupby 查询
Posted
技术标签:
【中文标题】在烧瓶 mongoDB 中加入集合的 groupby 查询【英文标题】:groupby query on joined collection in flask mongoDB 【发布时间】:2022-01-23 01:55:00 【问题描述】:我目前陷入这个问题,我对 MongoDB 比较陌生,我必须检索 报告数量(用户完成的报告数量)特定用户及其姓名(姓名),上次报告时间(上次报告帖子的时间),上次原因(report_description),
我被困在这里 2 天了,我们将不胜感激。
举报帖子集合
"created_at":
"$date": "2021-12-21T18:45:27.489Z"
,
"updated_at":
"$date": "2021-12-21T18:45:27.489Z"
,
"post_id":
"$oid": "61955ac35b3475f1d9759255"
,
"user_id": 2,
"report_type": "this is test",
"report_description": "this"
发布收藏
"created_at":
"$date": "2021-11-17T19:24:53.484Z"
,
"updated_at":
"$date": "2021-11-17T19:24:53.484Z"
,
"user_id": 8,
"privacy_type": "public",
"post_type": "POST",
"post": "Om Sai Ram",
"total_like": 7,
"total_comment": 0,
"total_share": 0,
"image_url_list": [
"image_url": "post_images/user-8/a31e39334987463bb9faa964391a935e.jpg",
"image_ratio": "1"
],
"video_url_list": [],
"tag_list": [],
"is_hidden": false
用户收藏
"name": "sathish",
"user_id": 1,
"device_id": "faTOi3aVTjyQnBPFz0L7xm:APA91bHNLE9anWYrKWfwoHgmGWL2BlbWqgiVjU5iy7JooWxu26Atk9yZFxVnNp2OF1IXrXm4I6HdVJPGukEppQjSiUPdMoQ64KbOt78rpctxnYWPWliLrdxc9o1VdKL0DGYwE7Y6hx1H",
"user_name": "sathishkumar",
"updated_at":
"$date": "2021-11-17T19:13:52.668Z"
,
"profile_picture_url": "1"
flask_snip.py
flagged_posts = mb.db_report.aggregate([
'$group':
'_id':'$user_id',
])
预期应该是列表,例如
[
'user_id':1,
'name' :'somename',
'no_of_reports':30,
'last_reported_time':sometime,
'reason':'reason_of lastreported_post',
'post_link':'someurl',
,
'user_id':2,
'name' :'somename',
'no_of_reports':30,
'last_reported_time':sometime,
'reason':'reason_of last_reported_post',
'post_link':'someurl',
,
'user_id':3,
'name' :'somename',
'no_of_reports':30,
'last_reported_time':sometime,
'reason':'reason_of lastreported_post',
'post_link':'someurl',
,
]
【问题讨论】:
【参考方案1】:从reported
集合开始,您可以通过$group
获取last_reason
和last_reported_time
。然后,执行$lookup
到user
的集合以获取名称。
db.reported.aggregate([
"$sort":
updated_at: -1
,
"$group":
"_id": "$user_id",
"last_reported_time":
"$first": "$updated_at"
,
"last_reason":
"$first": "$report_description"
,
"no_of_reports":
$sum: 1
,
"$lookup":
"from": "user",
"localField": "_id",
"foreignField": "user_id",
"as": "userLookup"
,
"$unwind": "$userLookup"
,
"$project":
"user_id": "$_id",
"name": "$userLookup.user_name",
"no_of_reports": 1,
"last_reported_time": 1,
"last_reason": 1
])
这是Mongo playground 供您参考。
【讨论】:
我想要reported_posts 集合中所有帖子的结果,这行得通吗 什么是所有帖子的结果?您能否通过为您的数据集添加预期输出来详细说明? 我已经更新了 @AtifShafi 更新了答案以更符合您的预期输出。但是,当前版本只会显示在reported
集合中有记录的 user_id。另一个问题是您没有在预期的输出中指定post_link
的来源,因此它目前为空。
我如何在烧瓶上下文中访问它,因为显示此对象不会返回任何内容,它会返回光标内的光标以上是关于在烧瓶 mongoDB 中加入集合的 groupby 查询的主要内容,如果未能解决你的问题,请参考以下文章
除了 $lookup 运算符之外,MongoDB 4.0 中加入的替代方法是啥,因为它不适用于分片集合