mongodb聚合中根据时间戳排序

问题描述 投票:0回答:2

我有这个合集

{“ip”:“192.168.141.1”,“ifsIndex”:“28”,“link”:“1”,“timeStamp”:“19-01-2018 18:12:42”} { "ip": "192.168.141.1", "ifsIndex": "30", "link": "1", "timeStamp": "19-01-2018 18:12:42" } { "ip": "192.168.141.1", "ifsIndex": "32", "link": "1", "timeStamp": "19-01-2018 18:12:42" } {“ip”:“192.168.141.1”,“ifsIndex”:“29”,“link”:“1”,“timeStamp”:“19-01-2018 18:12:42”} { "ip": "192.168.141.1", "ifsIndex": "31", "link": "1", "timeStamp": "19-01-2018 18:12:42" } { "ip": "192.168.141.1", "ifsIndex": "28", "link": "1", "timeStamp": "19-01-2018 18:14:16" } { "ip": "192.168.141.1", "ifsIndex": "29", "link": "1", "timeStamp": "19-01-2018 18:16:33" } { "ip": "192.168.141.1", "ifsIndex": "32", "link": "1", "timeStamp": "19-01-2018 18:14:09" } { "ip": "192.168.141.1", "ifsIndex": "28", "link": "1", "timeStamp": "19-01-2018 18:16:33" } { "ip": "192.168.141.1", "ifsIndex": "30", "link": "1", "timeStamp": "19-01-2018 18:14:16" } { "ip": "192.168.141.1", "ifsIndex": "31", "link": "1", "timeStamp": "19-01-2018 18:16:33" } { "ip": "192.168.141.1", "ifsIndex": "29", "link": "1", "timeStamp": "19-01-2018 18:14:16" } { "ip": "192.168.141.1", "ifsIndex": "30", "link": "1", "timeStamp": "19-01-2018 18:16:33" } { "ip": "192.168.141.1", "ifsIndex": "31", "link": "1", "timeStamp": "19-01-2018 18:14:16" } {“ip”:“192.168.141.1”,“ifsIndex”:“32”,“链接”:“1”,“时间戳”:“19-01-2018 18:16:33”}

我想将 ip 地址和 ifsIndex 组合在一起,并显示链接和时间戳的数组,并以排序的时间戳显示结果。我尝试了这个

db.events.aggregate([{$group:{_id:{"ifIndex":"$ifsIndex","ip":"$ip"},status:{$push:"$link"},timeStamp:{$push:"$timeStamp"}}},{$sort:{"timeStamp":1}}])

我得到的结果不是我想要的。有些值未按时间戳排序

{ "_id" : { "ifIndex" : "31", "ip" : "192.168.141.1" }, "status" : [ "1", "1", "1" ], "timeStamp" : [ "19-01-2018 18:12:42", "19-01-2018 18:16:33", "19-01-2018 18:14:16" ] }
{ "_id" : { "ifIndex" : "29", "ip" : "192.168.141.1" }, "status" : [ "1", "1", "1" ], "timeStamp" : [ "19-01-2018 18:12:42", "19-01-2018 18:16:33", "19-01-2018 18:14:16" ] }
{ "_id" : { "ifIndex" : "32", "ip" : "192.168.141.1" }, "status" : [ "1", "1", "1" ], "timeStamp" : [ "19-01-2018 18:12:42", "19-01-2018 18:14:09", "19-01-2018 18:16:33" ] }
{ "_id" : { "ifIndex" : "30", "ip" : "192.168.141.1" }, "status" : [ "1", "1", "1" ], "timeStamp" : [ "19-01-2018 18:12:42", "19-01-2018 18:14:16", "19-01-2018 18:16:33" ] }
{ "_id" : { "ifIndex" : "28", "ip" : "192.168.141.1" }, "status" : [ "1", "1", "1" ], "timeStamp" : [ "19-01-2018 18:12:42", "19-01-2018 18:14:16", "19-01-2018 18:16:33" ] }

ifIndex 31和29的时间戳不排序,其他排序。我在这里做错了什么?

arrays mongodb sorting aggregation-framework
2个回答
2
投票

$sort
时间戳,然后执行
$group
来排序
$push

db.events.aggregate(
    [   
        {$sort:{"timeStamp":1}},
        {$group:{_id:{"ifIndex":"$ifsIndex","ip":"$ip"},status:{$push:"$link"},timeStamp:{$push:"$timeStamp"}}}
        
    ]
)

结果

> db.events.aggregate( [ {$sort:{"timeStamp":1}}, {$group:{_id:{"ifIndex":"$ifsIndex","ip":"$ip"},status:{$push:"$link"},timeStamp:{$push:"$timeStamp"}}}  ])
{ "_id" : { "ifIndex" : "31", "ip" : "192.168.141.1" }, "status" : [ "1", "1", "1" ], "timeStamp" : [ "19-01-2018 18:12:42", "19-01-2018 18:14:16", "19-01-2018 18:16:33" ] }
{ "_id" : { "ifIndex" : "28", "ip" : "192.168.141.1" }, "status" : [ "1", "1", "1" ], "timeStamp" : [ "19-01-2018 18:12:42", "19-01-2018 18:14:16", "19-01-2018 18:16:33" ] }
{ "_id" : { "ifIndex" : "29", "ip" : "192.168.141.1" }, "status" : [ "1", "1", "1" ], "timeStamp" : [ "19-01-2018 18:12:42", "19-01-2018 18:14:16", "19-01-2018 18:16:33" ] }
{ "_id" : { "ifIndex" : "30", "ip" : "192.168.141.1" }, "status" : [ "1", "1", "1" ], "timeStamp" : [ "19-01-2018 18:12:42", "19-01-2018 18:14:16", "19-01-2018 18:16:33" ] }
{ "_id" : { "ifIndex" : "32", "ip" : "192.168.141.1" }, "status" : [ "1", "1", "1" ], "timeStamp" : [ "19-01-2018 18:12:42", "19-01-2018 18:14:09", "19-01-2018 18:16:33" ] }
> 

有一种排序可以在更新操作中对数组元素进行排序,但不能在聚合中进行排序doc


1
投票

我用它来使用聚合对任何时间戳字段进行排序,我按文档的最新更新时间对其进行排序。如果需要的话可以稍后分组。您可以在此处了解有关聚合$sort的更多信息。

aggregate.push({ $sort: { updated_at: -1 } });

我所做的就是制作聚合操作块,将它们推送到数组中并一起执行。我发现如果某些功能无法正常工作,调试起来会更容易。

© www.soinside.com 2019 - 2024. All rights reserved.