#python #mongodb #twitter #pymongo
#python #mongodb #Twitter #пимонго
Вопрос:
У меня есть коллекция из 24,8 миллионов документов (объектов tweet). Каждый объект tweet представляет один твит. Пример объекта tweet:
{'_id': ObjectId('5ff0798da1fb5219b93ef4ca'),
'tweet_id': 1233904784635256833,
'user_id': 1092190045,
'user_followers_count': 1653,
'user_friends_count': 24,
'user_tweets_count': 62340,
'user_mentions': [],
'coordinates': {'type': 'Point', 'coordinates': [13.435, 52.481388]},
'created_at': 'Sun Mar 01 00:00:00 0000 2020',
'lang': 'de',
'text': 'schepper'}
Я хочу найти общее количество твитов в будние дни (пн -пт) и выходные (Сб и Вс).
Я попробовал это:
tweets_by_weekday = [{
"$group": {
"_id": {
"day": {
"$dayOfWeek": "created_at"
}
},
"count":{"$sum":1}
}
}]
list(tweetsData.aggregate(tweets_by_weekday))
Комментарии:
1. Хранение значений даты / времени в виде строки является недостатком дизайна. Храните их должным образом как
Date
объект, тогда_id: { $dayOfWeek: "$created_at" }
они будут работать (обратите внимание на отсутствие$
в вашем коде).
Ответ №1:
Как насчет:
search_request = { "$or":
[
{ "created_at": { "$regex": "^Mon .*" } },
{ "created_at": { "$regex": "^Tue .*" } },
{ "created_at": { "$regex": "^Wed .*" } },
{ "created_at": { "$regex": "^Thu .*" } },
{ "created_at": { "$regex": "^Fri .*" } }
]
}
mycol.find(search_request).count() #Older pymongo
mycol.count_documents(search_request) #Newer pymongo
и:
search_request = { "$or":
[
{ "created_at": { "$regex": "^Sat .*" } },
{ "created_at": { "$regex": "^Sun .*" } }
]
}
mycol.find(search_request).count() #Older pymongo
mycol.count_documents(search_request) #Newer pymongo
Ответ №2:
Другой вариант:
tweetsData.aggregate([{$project:{_id:0,d:{$substr:["$created_at",0,3]}}} , {$group:{_id:"$d" ,cnt:{$sum:1} } } ])
{ "_id" : "Sat", "cnt" : 1 }
{ "_id" : "Sun", "cnt" : 1 }
{ "_id" : "Thu", "cnt" : 1 }
{ "_id" : "Wed", "cnt" : 1 }
{ "_id" : "Tue", "cnt" : 1 }
{ "_id" : "Fri", "cnt" : 1 }
{ "_id" : "Mon", "cnt" : 1 }
и распределяется по выходным и рабочим дням:
tweetsData.aggregate([{$project:{_id:0,d:{$substr:["$created_at",0,3]}}} , {$group:{_id:"$d" ,cnt:{$sum:1} } } , {$facet:{ "weekends":[ {$match:{_id:{$in:['Sat','Sun' ]}}} ,{$group:{_id:"weekends" , total:{$sum:"$cnt"}}} ],"week":[ {$match:{_id:{$in:['Mon','Tue','Wed','Thu','Fri']} } } , {$group:{_id:"week" , total:{$sum:"$cnt"}}} ] } } ])
{ "weekends" : [ { "_id" : "weekends", "total" : 2 } ], "week" : [ { "_id" : "week", "total" : 5 } ] }