在烧瓶 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_reasonlast_reported_time。然后,执行$lookupuser 的集合以获取名称。

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 中加入的替代方法是啥,因为它不适用于分片集合

如何在mongodb中加入查询?

在 mongodb 中加入类似查询

如何在 mongodb 中使用 $lookup 加入多个集合

$lookup 与深度嵌套的对象

如何在VBA中加入集合