MongoDB подсчитывает общее количество твитов в будние и выходные дни (Python)

#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 } ] }