我有一個充滿tweet的mongodb實例,我使用PyMongo作爲驅動程序。每條推文都有一個指定其語言的字段。我有以下彙總查詢: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'和1300萬條推文'en'。當我使用'ru'推文運行它時,聚合在mongo shell和我的腳本中都起作用,但是當我爲'en'推文嘗試時,腳本掛起並且從未完成。
在mongo shell中'en'的運行聚合成功完成。當我從腳本運行它時,我可以檢查mongo shell中的操作,看到它啓動並完成,但我從來沒有得到任何輸出。
問題是,在Python腳本的情況下,當我嘗試聚合集合的較大子集時,即使它在數據庫中成功處理,也不會返回結果。我嘗試從Pymongo捕獲例外無濟於事。我懷疑有些東西是超時的,但我無法弄清楚它是什麼或如何捕捉它。