我有一系列转推,我想展示转发最多的转推。
这是样本数据。
screen_name
所以每个文件都是转推。我可以汇总哪个用户转发次数最多,但只返回db.getCollection('raw_tweets').aggregate(
{ $group : { _id: "$user.id_str", count : { $sum : 1 } } },
{ $match : { count : { $gte : 1 } } },
{ $sort : { count : -1 } },
)
我希望结果返回{
"_id" : "121817564",
"count" : 1419.0000000000000000
}
。
这是我的询问。
{
"_id" : "121817564",
"count" : 1419.0000000000000000,
"screen_name" : "screen_name"
}
这是我的结果
Polygon(Point... pts) {
// ...
}
我的预期结果是
java.awt.Point
答案 0 :(得分:2)
在$group
阶段,您可以添加其他字段screenname
并使用$first
或$last
对其进行设置,以便从该组中的第一个或最后一个文档中获取该字段:
db.getCollection('raw_tweets').aggregate(
{ $group : { _id: "$user.id", screenname: { $last :"$user.screen_name"}, count : { $sum : 1 } } },
{ $match : { count : { $gte : 1 } } },
{ $sort : { count : -1 } }
)
如果没有指定排序,则不会定义文档的顺序,因此将选择作为第一个/最后一个的文档也是未定义的。如果用户的屏幕名称永远不会更改,或者您不关心选择了哪个屏幕名称,则上述方法就足够了。
如果屏幕名称可以更改,并且您确实关注选择了哪个屏幕名称,则需要添加更多逻辑。例如,如果您决定使用最新的屏幕名称,则可以按日期升序排序,然后选择最后一个屏幕名称:
db.getCollection('raw_tweets').aggregate(
{ $sort : { date : 1 } },
{ $group : { _id: "$user.id", screenname: { $last :"$user.screen_name"}, count : { $sum : 1 } } },
{ $match : { count : { $gte : 1 } } },
{ $sort : { count : -1 } }
)
答案 1 :(得分:0)
它看起来像这样:
db.getCollection('tweets').aggregate( [
{
$group : {
_id: { id : "$user.id", screen_name: "$user.screen_name" },
count : { $sum : 1 }
}
},
{ $match : { count : { $gte : 1 } } },
{ $sort : { count : -1 } },
{ $project : { "_id": "$_id.id", "screen_name": "$_id.screen_name", count :1 } }
]
)
你可以在shell中获得输出,如:
{
"waitedMS": NumberLong("0"),
"result": [
{
"_id": 177202000,
"count": 1,
"screen_name": "Karunaprof"
}
],
"ok": 1
}