Soy un principiante en MongoDB. Tengo 20 millones de documentos en una colección de MongoDB. Ejemplo de un solo documento:
Quiero obtener el recuento total de tweets, el número de amigos y el número de seguidores de cada usuario_nombre_de_pantalla junto con el año de creación de la cuenta de cada usuario_nombre_de_pantalla.
Intenté esto:
user_details_pipeline = [{ "$project": { "_id": 0, "user_mentions": 1, "user_followers_count": 1, "user_friends_count": 1, "user_account_creation": 1 } }, { "$unwind": "$user_mentions" }, { "$group": { "_id": "$user_mentions.screen_name", "count": { "$sum": 1 } } }, { "$sort": { "count": -1 } } ]Pero esto no consulta el recuento de tweets, seguidores, amigos y la fecha de creación de la cuenta, solo cuántas veces se menciona a un usuario. Alguien puede ayudarme porfavor?
Ejemplo de una salida:
{"user_screen_name": "BorisJohnson", "user_followers_count": 1000000, "user_friends_count": 50, "total_tweets": 50000, "user_account_creation": 2012}Básicamente, necesita usar la agregación de $group aquí.
aggregate([ { $group: { _id: "$user_screen_name", user_followers_count: { $sum: "$user_followers_count" }, user_friends_count: { $sum: "$user_friends_count" }, total_tweets: { $sum: "$total_tweets" }, user_account_creation: { $first: "$user_account_creation" } }} ])Si su fecha no es un tipo de fecha (¡realmente debería serlo!), puede usar la siguiente consulta agregada usando $substr (para dividir el año) y $min (para obtener el año más antiguo)
result = db.mycollection.aggregate([ {'$group': { '_id': '$user_screen_name', 'user_followers_count': {'$sum': '$user_followers_count'}, 'user_friends_count': {'$sum': '$user_friends_count'}, 'total_tweets': {'$sum': '$user_tweets_count'}, 'user_account_creation': {'$min': {'$substr': ['$user_account_creation', 26, 4]}} }}, {'$project': { '_id': 0, 'user_screen_name': '$_id', 'user_followers_count': 1, 'user_friends_count': 1, 'total_tweets': 1, 'user_account_creation': 1 }} ])Puedes hacer esto usando la agregación. Simplemente está proyectando los campos deseados, pero la agregación proporciona el operador $year (y otros) para devolver el componente deseado a partir de una fecha. Debe asegurarse de que las fechas se hayan almacenado como ISODate() .
db.collection.aggregate( [ "$project" : { "_id": 0, "user_screen_name": 1, "user_followers_count": 1, "user_friends_count": 1, "total_tweets": 1, "user_account_creation": { "$year" : "$user_account_creation" } } ] ) Si no está usando ISODate() , puede usar el operador $dateFromString con formato específico para obtener un ISODate() y luego usarlo según sea necesario.
{ "$dateFromString": { "dateString": "06-15-2018", "format": "%m-%d-%Y" } }Sin embargo, los especificadores de formato enumerados en la documentación solo funcionan con componentes numéricos y no con palabras (como "jueves" o "ene").