我有这个合集
{“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的时间戳不排序,其他排序。我在这里做错了什么?
$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
我用它来使用聚合对任何时间戳字段进行排序,我按文档的最新更新时间对其进行排序。如果需要的话可以稍后分组。您可以在此处了解有关聚合$sort的更多信息。
aggregate.push({ $sort: { updated_at: -1 } });
我所做的就是制作聚合操作块,将它们推送到数组中并一起执行。我发现如果某些功能无法正常工作,调试起来会更容易。