我有一个充满推文的mongodb实例,我使用PyMongo作为驱动程序。每条推文都有一个指定其语言的字段。我有以下聚合查询:
def get_top_k_hashtags(client, db_name, lang_list, k_filter):
k_filter_base = k_filter
k_filter = "$" + k_filter
dbo = client[db_name]
pipeline = [
{"$match": {"lang": {"$in": lang_list}}},
{"$project": {k_filter_base: 1, "_id": 0}},
{"$unwind": k_filter},
{"$group": {"_id": k_filter + ".text", "count": {"$sum": 1}}},
{"$sort": SON([("count", -1), ("_id", -1)])}
]
return dbo.tweets.aggregate(pipeline, allowDiskUse=True)
我用以下测试函数调用
def test_get_top_k_hashtags(client, db_name, lang_list, k_filter):
frequency = []
cursor = get_top_k_hashtags(
client, db_name, lang_list, k_filter)
for document in cursor:
frequency.append({'hashtag': document['_id'],
'value': document['count']})
pprint(frequency)
write_json_file('hashtag_distribution', DATA_PATH, frequency)
test_get_top_k_hashtags(client, 'twitter', ['ru'], 'entities.hashtags')
我正在做的是获取特定语言下所有主题标签的总计数,在这种情况下是' ru'。我有大约17K的推文匹配' ru'以及' en'以及1300万条推文。当我使用' ru'运行它时,聚合在mongo shell和我的脚本中都有效。推文,但是当我尝试它的时候。推文脚本挂起,永远不会完成。
为' en'运行聚合在mongo shell中成功完成。当我从脚本运行它时,我可以检查mongo shell中的操作并看到它启动和完成,但我从来没有得到任何输出。
问题是,对于Python脚本,当我尝试聚合集合的更大子集时,即使在db中成功处理了结果,也不会返回结果。我试过从Pymongo捕捉异常无济于事。我怀疑某些东西已超时,但我无法弄清楚它是什么或如何抓住它。
答案 0 :(得分:0)
对于任何可能出现并且看到这一点的人,我决定通过mongoshell运行我长时间运行的查询。我通过mongoshell运行我的聚合并输出到一个集合并从那里开始。