2015-04-29 2 views
0

Я начинаю, я написал строку для моего конвейера, которая работает, но я хочу добавить другую информацию в свой вывод, например, имя экрана или количество твитов. Я попытался добавить это под $ group, но дал мне синтаксическую ошибку каждыйMongodb Как добавить дополнительную информацию при агрегировании?

вот мой трубопровод:

def make_pipeline(): 
    # complete the aggregation pipeline 
    pipeline = [ 
    { 
     '$match': { 
      "user.statuses_count": {"$gt":99 }, 
      "user.time_zone": "Brasilia" 
     } 
    }, 
    { 
     "$group": { 
      "_id": "$user.id", 
      "followers": { "$max": "$user.followers_count" } 

     } 
    }, 
    { 
     "$sort": { "followers": -1 } 
    }, 
    { 
     "$limit" : 1 
    } 
]; 

Я использую его на этом примере:

{ 
    "_id" : ObjectId("5304e2e3cc9e684aa98bef97"), 
    "text" : "First week of school is over :P", 
    "in_reply_to_status_id" : null, 
    "retweet_count" : null, 
    "contributors" : null, 
    "created_at" : "Thu Sep 02 18:11:25 +0000 2010", 
    "geo" : null, 
    "source" : "web", 
    "coordinates" : null, 
    "in_reply_to_screen_name" : null, 
    "truncated" : false, 
    "entities" : { 
     "user_mentions" : [ ], 
     "urls" : [ ], 
     "hashtags" : [ ] 
    }, 
    "retweeted" : false, 
    "place" : null, 
    "user" : { 
     "friends_count" : 145, 
     "profile_sidebar_fill_color" : "E5507E", 
     "location" : "Ireland :)", 
     "verified" : false, 
     "follow_request_sent" : null, 
     "favourites_count" : 1, 
     "profile_sidebar_border_color" : "CC3366", 
     "profile_image_url" : "http://a1.twimg.com/profile_images/1107778717/phpkHoxzmAM_normal.jpg", 
     "geo_enabled" : false, 
     "created_at" : "Sun May 03 19:51:04 +0000 2009", 
     "description" : "", 
     "time_zone" : null, 
     "url" : null, 
     "screen_name" : "Catherinemull", 
     "notifications" : null, 
     "profile_background_color" : "FF6699", 
     "listed_count" : 77, 
     "lang" : "en", 
     "profile_background_image_url" : "http://a3.twimg.com/profile_background_images/138228501/149174881-8cd806890274b828ed56598091c84e71_4c6fd4d8-full.jpg", 
     "statuses_count" : 2475, 
     "following" : null, 
     "profile_text_color" : "362720", 
     "protected" : false, 
     "show_all_inline_media" : false, 
     "profile_background_tile" : true, 
     "name" : "Catherine Mullane", 
     "contributors_enabled" : false, 
     "profile_link_color" : "B40B43", 
     "followers_count" : 169, 
     "id" : 37486277, 
     "profile_use_background_image" : true, 
     "utc_offset" : null 
    }, 
    "favorited" : false, 
    "in_reply_to_user_id" : null, 
    "id" : NumberLong("22819398300") 
} 

ответ

0

Используйте $first и ваш запрос трубопровода агрегации, как показано ниже:

db.collectionName.aggregate({ 
    "$match": { 
    "user.statuses_count": { 
     "$gt": 99 
    }, 
    "user.time_zone": "Brasilia" 
    } 
}, { 
    "$sort": { 
    "user.followers_count": -1 // sort followers_count first 
    } 
}, { 
    "$group": { 
    "_id": "$user.id", 
    "followers": { 
     "$first": "$user.followers_count" //use mongo $first method to get followers count or max followers count 
    }, 
    "screen_name": { 
     "$first": "$user.screen_name" 
    }, 
    "retweet_count": { 
     "$first": "$retweet_count" 
    } 
    } 
}) 

Или с помощью $limit и $project, как

db.collectionName.aggregate({ 
    "$match": { 
    "user.statuses_count": { 
     "$gt": 99 
    }, 
    "user.time_zone": "Brasilia" 
    } 
}, { 
    "$sort": { 
    "user.followers_count": -1 // sort followers_count 
    } 
}, { 
    "$limit": 1 // Set limit 1 so get max followers_count document first 
}, { 
    "$project": { // user project here 
    "userId": "$user.id", 
    "screen_name": "$user.screen_name", 
    "retweet_count": "$retweet_count" 
    } 
}).pretty() 
0

следующий конвейер агрегации использует переменную $$ROOT системы, которая ссылается на корневой документ, то есть документ верхнего уровня, обрабатываемой в данный момент на стадии трубопровода $group агрегации , Это добавляется к массиву с помощью оператора $addToSet. На следующем этапе трубопровода, вы можете $unwind массив, чтобы получить нужные поля через $project оператора изменяет форму выходного документа:

db.tweet.aggregate([ 
    { 
     '$match': { 
      "user.statuses_count": { "$gte": 100 }, 
      "user.time_zone": "Brasilia" 
     } 
    }, 
    { 
     "$group": { 
      "_id": "$user.id", 
      "max_followers": { "$max": "$user.followers_count" }, 
      "data": { "$addToSet": "$$ROOT" } 
     } 
    }, 
    { 
     "$unwind": "$data" 
    }, 
    { 
     "$project": { 
      "_id": "$data._id", 
      "followers": "$max_followers", 
      "screen_name": "$data.user.screen_name", 
      "tweets": "$data.user.statuses_count" 
     } 
    }, 
    { 
     "$sort": { "followers": -1 } 
    }, 
    { 
     "$limit" : 1 
    } 
]) 

Следующий трубопровод также достигает тот же результат, но не использует $ группа оператор:

pipeline = [ 
    { 
     "$match": { 
      "user.statuses_count": { 
       "$gte": 100 
      }, 
      "user.time_zone": "Brasilia" 
     } 
    }, 
    { 
     "$project": {     
      "followers": "$user.followers_count", 
      "screen_name": "$user.screen_name", 
      "tweets": "$user.statuses_count" 
     } 
    }, 
    { 
     "$sort": { 
      "followers": -1 
     } 
    }, 
    {"$limit" : 1} 
] 

PyMongo Выход:

{u'ok': 1.0, 
u'result': [{u'_id': ObjectId('5304e2d34149692bc5172729'), 
       u'followers': 17209, 
       u'screen_name': u'AndreHenning', 
       u'tweets': 8219}]} 
Смежные вопросы