2014-08-15 1 views
0

В настоящее время я экспериментирую с MongoDB. Используя Twitters Streaming API, я собрал кучу твитов (казалось, хороший способ научиться использовать параметры агрегации MongoDB).Агрегат в MongoDB возвращает больше полей

У меня есть следующий запрос

db.twitter.aggregate([ 
    { $group : { _id : '$status.user.screen_name', count: { $sum : 1 } } }, 
    { $sort : { count : -1, _id : 1 } }, 
    { $skip : 0 }, 
    { $limit : 5 }, 
]); 

Как и следовало ожидать, это тот результат:

{ 
    "result" : [ 
     { 
      "_id" : "VacaturesBreda", 
      "count" : 5 
     }, 
     { 
      "_id" : "breda_nws", 
      "count" : 3 
     }, 
     { 
      "_id" : "BredaDichtbij", 
      "count" : 2 
     }, 
     { 
      "_id" : "JobbirdUTITBaan", 
      "count" : 2 
     }, 
     { 
      "_id" : "vacatures_nr1", 
      "count" : 2 
     } 
    ], 
    "ok" : 1 
} 

Вопрос заключается в том, как я могу соответствовать на пользователе id_str и вернуть screen_name и, например, followers_count пользователя. Я попытался сделать это с помощью { $project .... }, но в итоге я получил пустой набор результатов.

Для тех, кто не знаком с пользовательским объектом в Twitters, JSON откликнется здесь на части (только что выбрал первого пользователя в db).

"user" : { 
     "id" : 2678963916, 
     "id_str" : "2678963916", 
     "name" : "JobbirdUT IT Banen", 
     "screen_name" : "JobbirdUTITBaan", 
     "location" : "Utrecht", 
     "url" : "http://www.jobbird.com", 
     "description" : "Blijf op de hoogte van de nieuwste IT/Automatisering vacatures in Utrecht, via http://Jobbird.com", 
     "protected" : false, 
     "verified" : false, 
     "followers_count" : 1, 
     "friends_count" : 1, 
     "listed_count" : 0, 
     "favourites_count" : 0, 
     "statuses_count" : 311, 
     "created_at" : "Fri Jul 25 07:35:48 +0000 2014", 
     ... 
    }, 

Update: В соответствии с просьбой ясный пример о предлагаемом ответе (извините за не добавлять его).

Так что вместо группировки на screen_name группировка на id_str. Почему вы могли бы спросить, можно редактировать screen_name, но вы все еще тот же пользователь в Твиттере (так что последний screen_name должен быть возвращен:

db.twitter.aggregate([ 
    { $group : { _id : '$status.user.id_str', count: { $sum : 1 } } }, 
    { $sort : { count : -1, _id : 1 } }, 
    { $skip : 0 }, 
    { $limit : 5 }, 
]); 

И как-то ответ, как это:

{ 
    "result" : [ 
     { 
      "_id" : "123456789", 
      "screen_name": "awsome_screen_name", 
      "followers_count": 523, 
      "count" : 5 
     }, 
     .... 
    ], 
    "ok" : 1 
} 
+0

Мог ли добавить более четкий пример того, что вы ожидаете от ответа? –

+0

@NeilLunn Извините, я добавил это сейчас, подумал, что я был достаточно ясен, но спасибо, что указали это. –

ответ

3

Вы в основном ищете оператора, который конкретно не «агрегат» содержание, и это в основном то, что $first и $last операторы делают:

db.twitter.aggregate([ 
    { "$group": { 
     "_id": "$status.user.id_str", 
     "screen_name": { "$first": "$status.user.screen_name" }, 
     "followers_count": { "$sum": "$status.user.followers_count" }, 
     "count": { "$sum": 1 } 
    }}, 
    { "$sort": { "followers_count": -1, "count": -1 } }, 
    { "$limit": 5 } 
]) 

Который выбирает «первое» появление поля на основе ключа группировки. Это обычно полезно, если в документе дублируются связанные данные в документе с помощью ключа группировки.

Альтернативный подход заключается в том, чтобы включать поля в группу группировки. Вы можете позже реструктурировать с $project:

db.twitter.aggregate([ 
    { "$group": { 
     "_id": { 
      "_id": "$status.user.id_str", 
      "screen_name": "$status.user.screen_name" 
     }, 
     "followers_count": { "$sum": "$status.user.followers_count" }, 
     "count": { "$sum": 1 } 
    }}, 
    { "$project": { 
     "_id": "$_id._id", 
     "screen_name": "$_id.screen_name" 
     "followers_count": 1, 
     "count": 1 
    }}, 
    { "$sort": { "followers_count": -1, "count": -1 } }, 
    { "$limit": 5 } 
]) 

Что полезно, когда вы не уверены в релевантная «уникальность».

+0

Спасибо, что сработало. Однако вопрос был у меня под впечатлением, что группировка данных будет происходить во всех полях в разделе группы, но могу ли я сказать, что она группируется только в поле '_id'? –

+0

@MThomas Я добавил к этому еще один подход. Да, поле '_id' является« ключом группировки », все, что находится за пределами этого, требует [« оператор группировки аккумуляторов »] (http://docs.mongodb.org/manual/reference/operator/aggregation-group/). Лучше всего взглянуть на все агенты агрегации в документации, чтобы получить понимание. –

+0

спасибо.Последний вопрос для этих операторов, я был в предположении, что '$ sum' будет складывать все значения этого поля (как и в счете), но почему это не так для' followers_count'. Я бы использовал '$ first'. –

 Смежные вопросы

  • Нет связанных вопросов^_^