当前位置: 首页 > 知识库问答 >
问题:

在pymongo中使用$push和$group

鲁望
2023-03-14

修复我的make_pipeline()函数,使用聚合查询,计算每个用户的推文数量,将它们添加到数组中,并返回推文最多的5个用户。

使用聚合查询,计算每个用户的tweet数量。在相同的$group阶段,使用$push累积每个用户的所有tweet文本。

将你的输出限制在推特最多的5个用户。

结果文档应仅包括以下字段:

  • “\u id”(用户的屏幕名称),
  • “count”(为用户找到的推文数量),
  • “tweet\u text”(为用户找到的tweet文本列表)

为了实现前面的目标,我正在测试以下代码:

def make_pipeline():
    # complete the aggregation pipeline
    pipeline = [
        {"$group": {"_id": "$user.screen_name", "tweet_texts": {"$push": "$text"}, "count": {"$sum": 1}}},
        {"$project": {"_id": "$user.screen_name", "count": 1, "tweet_texts": 1}},
        {"$sort" : {"count" : -1}},
        {"$limit": 5}
    ]
    return pipeline

首先,我根据用户名对所有推文进行分组。然后,在同一阶段,我将所有发短信的tweet推到tweet\u text,并统计分组后的每个事件。我相信这会让我拥有最多推特的用户数量。

然后我进行投影,仅选择我想要的三个字段:

  • _id
  • 计数
  • 推文

我通过排序和限制结果的数量来完成。

我通过了考试,但没有通过考试。我做错了什么?我现在的错误肯定是在第一阶段(集体),但我无法发现我做错了什么。

{
    "_id" : ObjectId("5304e2e3cc9e684aa98bef97"),
    "text" : "First week of school is over :P",
    "in_reply_to_status_id" : null,
    "retweet_count" : null,
    "contributors" : null,
    "created_at" : "Thu Sep 02 18:11:25 +0000 2010",
    "geo" : null,
    "source" : "web",
    "coordinates" : null,
    "in_reply_to_screen_name" : null,
    "truncated" : false,
    "entities" : {
        "user_mentions" : [ ],
        "urls" : [ ],
        "hashtags" : [ ]
    },
    "retweeted" : false,
    "place" : null,
    "user" : {
        "friends_count" : 145,
        "profile_sidebar_fill_color" : "E5507E",
        "location" : "Ireland :)",
        "verified" : false,
        "follow_request_sent" : null,
        "favourites_count" : 1,
        "profile_sidebar_border_color" : "CC3366",
        "profile_image_url" : "http://a1.twimg.com/profile_images/1107778717/phpkHoxzmAM_normal.jpg",
        "geo_enabled" : false,
        "created_at" : "Sun May 03 19:51:04 +0000 2009",
        "description" : "",
        "time_zone" : null,
        "url" : null,
        "screen_name" : "Catherinemull",
        "notifications" : null,
        "profile_background_color" : "FF6699",
        "listed_count" : 77,
        "lang" : "en",
        "profile_background_image_url" : "http://a3.twimg.com/profile_background_images/138228501/149174881-8cd806890274b828ed56598091c84e71_4c6fd4d8-full.jpg",
        "statuses_count" : 2475,
        "following" : null,
        "profile_text_color" : "362720",
        "protected" : false,
        "show_all_inline_media" : false,
        "profile_background_tile" : true,
        "name" : "Catherine Mullane",
        "contributors_enabled" : false,
        "profile_link_color" : "B40B43",
        "followers_count" : 169,
        "id" : 37486277,
        "profile_use_background_image" : true,
        "utc_offset" : null
    },
    "favorited" : false,
    "in_reply_to_user_id" : null,
    "id" : NumberLong("22819398300")
}

请帮忙!


共有2个答案

段干德泽
2023-03-14

读了这些评论,我发现

pipeline = [
        {"$group": {"_id": "$user.screen_name", "tweet_texts": {"$push": "$text"}, "count": {"$sum": 1}}},
        {"$project": {"_id": "$user.screen_name", "count": 1, "tweet_texts": 1}},
        {"$sort" : {"count" : -1}},
        {"$limit": 5}
    ]

事实上应改为:

pipeline = [ 
        {"$group": {"_id": "$user.screen_name", "tweet_texts": {"$push": "$text"}, "count": {"$sum": 1}}}, 
        {"$sort" : {"count" : -1}}, 
        {"$limit": 5}
    ]

完整的答案和解释见答案:

  • 这两个MongoDB查询之间有什么区别

故事的结论是我错误地使用了$project阶段。不仅首先不需要,为了使它幂等,它应该是

{"$project": {"_id": "$_id", "count": 1, "tweet_texts": 1}},

我也强烈推荐他的回答:

  • https://stackoverflow.com/a/40970901/1337392

以下用户值得称赞:

  • https://stackoverflow.com/users/122005/chridam

为我指引正确的道路!

壤驷宏才
2023-03-14

$project步骤是多余的,因为$group管道已经生成了这三个字段,所以不需要前面的$project阶段。

安装正确的管道

pipeline = [ 
    {
        "$group": {
            "_id": "$user.screen_name", 
            "tweet_texts": { "$push": "$text" }, 
            "count": { "$sum": 1 }
        }
    }, 
    { "$sort" : { "count" : -1 } }, 
    { "$limit": 5 } 
] 

您的$project管道无法工作,因为之前的$group管道未生成任何字段“$user.screen\u name”,您试图将其用作$project管道中的\u id字段。

但是,如果您想包含$project步骤,则工作管道应遵循以下步骤:

pipeline = [ 
    {
        "$group": {
            "_id": "$user.screen_name", 
            "tweet_texts": { "$push": "$text" }, 
            "count": { "$sum": 1 }
        }
    }, 
    { "$project": { "count": 1, "tweet_texts": 1 } },
    { "$sort" : { "count" : -1 } }, 
    { "$limit": 5 } 
] 
 类似资料:
  • 问题内容: 使用PyMongo,当我尝试检索按其“数字”和“日期”字段排序的对象时,如下所示: 我收到此错误: 我的排序查询出了什么问题? 问题答案: 应该是键方向对的列表,即 之所以必须是列表,是因为参数的顺序很重要,而s在Python <3.6中不排序

  • 问题内容: 我正在尝试在mongodb中执行查询日期,但结果始终为空。我的查询如下: //变量resultaMongo返回空。 Obs:我也尝试不使用.isoformat(),当我直接放入mongodb时,只有添加ISODate才返回结果。因此不会返回结果: 更重要的是,如果您编辑返回: 这是数据库中的记录序列: 如果我打印python的json变量,则会看到类似以下内容的内容: 我的Mongnd

  • 问题内容: 我需要使用pymongo用python搜索ObjectId,但是我总是会收到此错误。有什么想法如何搜索? 问题答案: 我使用pymongo 2.4.1。

  • 本文向大家介绍PyMongo安装使用笔记,包括了PyMongo安装使用笔记的使用技巧和注意事项,需要的朋友参考一下 这里是简单的安装和使用记录,首先要有一个可用的mongo环境,win环境或者linux环境都可以。 假定你对mongo有所了解和知道一些命令行操作。 安装和更新 跟大多数py包安装一样,可以源码安装,也可以使用pip或者easy_install来安装 安装 升级 其他安装方法请参照文

  • 问题内容: 我为使用堆栈的程序创建的2个类有问题。我得到的第一个问题是,当我尝试运行程序时,出现运行时错误。 这很难问,因为它做了很多事情。它要求用户输入以将数字添加到堆栈中,并检查堆栈是满还是空。我也可能需要帮助来复制阵列。 线程“主”中的异常java.lang.ArrayIndexOutOfBoundsException:在Lab15.main(Lab15.java:38)处在IntegerS

  • 完整代码: 完整日志: 附加到dockerfolder_mongodb_1,dockerfolder_docker_flask_mongo_1 mongodb_1 2018-08-27t13:14:18.349+0000 I控件[initandlisten]MongoDB开始:pid=1 port=27017 dbpath=/data/db 64位主机=E086871a3aeb mongodb_1