如何对聚合结果的每个文档中存在的文档数组进行排序?

时间:2014-04-29 13:03:45

标签: mongodb sorting aggregation-framework

我有一个名为event的集合。

我有一个聚合查询,如下所示

db.event.aggregate([
    { "$group": { 
       "_id":{ 
           "UserId":"$TracInfo.UserId",
           "SessionId":"$TracInfo.SessionId"
       },
       "EventName":{ "$push": {
           "Name":"$Name",
           "Time":"$Timestamp"
       }}
   }},                    
   { "$out" :"demo" }
])

其输出如下:

{
    "result":[
        {
            "_id" : {
                "UserId" : "pawan",
                "SessionId" : "q69lIFHcpsCRgxtbJu1v"
            },
            "EventName" : [
                {
                    "Name" : "PREMISES MAP DELETED",
                    "Time" : NumberLong("1336090020090")
                },
                {
                    "Name" : "SCREEN STOPPED",
                    "Time" : NumberLong("1336090020010")
                },
                {
                    "Name" : "SETTINGS CHANGED",
                    "Time" : NumberLong("1336090020030")
                },
                {
                    "Name" : "PREMISES MAP DELETED",
                    "Time" : NumberLong("1336090020100")
                },
                {
                    "Name" : "SCREEN STARTED",
                    "Time" : NumberLong("1336090020330")
                },
                ...
        },
            ...
    ]
}

我想在时间值的结果中对每个文档的EventName数组进行排序。

有什么办法吗?

我试过了

{$sort:{"EventName.Time":1}} 

但它不起作用。

2 个答案:

答案 0 :(得分:3)

首先确保在Timestamp上有一个索引以避免性能损失。

其次,使用此聚合:

db.event.aggregate([
                  { $sort: { Timestamp:1 } },
                  { $group:
                    { _id:{"UserId":"$TracInfo.UserId","SessionId":"$TracInfo.SessionId"},
                      EventName:{$push:{"Name":"$Name","Time":"$Timestamp"}}}},                   
                  {$out:"demo"}
                 ])

答案 1 :(得分:0)

在将数据推入数组之前对时间戳进行排序。