Django 如何在python3中的MongoDB中查找具有某些条件的最新文档?

Django 如何在python3中的MongoDB中查找具有某些条件的最新文档?,django,python-3.x,mongodb,Django,Python 3.x,Mongodb,我正在用python编写一个程序,我的mongodb数据库中有一个集合,其中包含一个id、一个时间戳、一个ip字符串和一个状态字符串,如下所示: { "_id": ObjectId("5b0edbb1094464505f1d2ce3"), "id": 20, "ip": "172.21.45.225", "port": 300, "status": "closed", "time": ISODate("2018-05-30T17:13:21.308Z") } 顺便说一下

我正在用python编写一个程序,我的mongodb数据库中有一个集合,其中包含一个id、一个时间戳、一个ip字符串和一个状态字符串,如下所示:

{
  "_id": ObjectId("5b0edbb1094464505f1d2ce3"),
  "id": 20,
  "ip": "172.21.45.225",
  "port": 300,
  "status": "closed",
  "time": ISODate("2018-05-30T17:13:21.308Z")
}
顺便说一下,我使用pymongo和djongo插件将我的Django代码连接到数据库

我想做的是为每个不同的ip选择状态为“open”的记录,该记录是该ip的最新记录。 我用sql提出了这个解决方案,但不知道如何在python和mongodb中实现

sql等效项:

select r1.*
from myRecords r1, myRecords r2
where r1.status = "open" and r1.ip = r2.ip and r1.time > r2.time

请看一下我的代码:

db.Testing.aggregate(
    [
        {
            "$match" :
            {   
                "status":"open"  
            }
        }, 
        {
            "$group" :
            {
                "_id": "$ip",  
                "id": { "$first": "$id"},  
                "ip": { "$first": "$ip"},
                "port": { "$first": "$port"},
                "status": { "$first": "$status"},
                "time": { "$max" : "$time"}
            }
        } 

    ]
    )
我的测试记录:

{ "_id" : ObjectId("5b6db06f33f7b2f7cd819d21"), "id" : 20, "ip" : "172.21.45.225", "port" : 300, "status" : "closed", "time" : ISODate("2018-05-30T17:13:21.308Z") }
{ "_id" : ObjectId("5b6db09733f7b2f7cd819d22"), "id" : 20, "ip" : "172.21.45.225", "port" : 300, "status" : "open", "time" : ISODate("2018-04-30T17:13:21.308Z") }
{ "_id" : ObjectId("5b6db09b33f7b2f7cd819d23"), "id" : 20, "ip" : "172.21.45.225", "port" : 300, "status" : "open", "time" : ISODate("2018-03-30T17:13:21.308Z") }
{ "_id" : ObjectId("5b6db09f33f7b2f7cd819d24"), "id" : 20, "ip" : "172.21.45.225", "port" : 300, "status" : "open", "time" : ISODate("2018-03-02T17:13:21.308Z") }
{ "_id" : ObjectId("5b6db3c233f7b2f7cd819d25"), "id" : 20, "ip" : "172.21.44.225", "port" : 300, "status" : "open", "time" : ISODate("2018-03-30T17:13:21.308Z") }
{ "_id" : ObjectId("5b6db3cb33f7b2f7cd819d26"), "id" : 20, "ip" : "172.21.44.225", "port" : 300, "status" : "open", "time" : ISODate("2018-04-30T17:13:21.308Z") }
{ "_id" : ObjectId("5b6db45333f7b2f7cd819d27"), "id" : 20, "ip" : "172.21.45.225", "port" : 300, "status" : "open", "time" : ISODate("2018-06-30T17:13:21.308Z") }
我的结果是:

{ "time" : ISODate("2018-04-30T17:13:21.308Z"), "id" : 20, "ip" : "172.21.44.225", "port" : 300, "status" : "open" }
{ "time" : ISODate("2018-06-30T17:13:21.308Z"), "id" : 20, "ip" : "172.21.45.225", "port" : 300, "status" : "open" }

使用$match筛选处于打开状态的文档,然后使用$sort on time desc和$group on ip以及$first筛选最新记录。