如何在Mongodb聚合管道中包含其他字段?

时间:2015-09-11 16:50:23

标签: mongodb

我有一系列转推,我想展示转发最多的转推。

这是样本数据。

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

2 个答案:

答案 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
}