给定一个包含文档的集合,例如:
{
"host" : "example.com",
"ips" : [
{
"ip" : NumberLong("1111111111"),
"timestamp" : NumberLong(1373970044)
},
{
"ip" : NumberLong("2222222222"),
"timestamp" : NumberLong(1234978746)
}
]
}
我需要返回 ip 值为 X 的所有文档,但前提是 X 的关联时间戳是 ips 数组中的最高时间戳(所以上面的示例文档应该 而不是 匹配对“2222222222”的搜索,因为那不是具有最新时间戳的 IP)。
这是我第一次在 MongoDB 中做一些非常基本的事情,所以我能得到的最接近的是:
这显然没有给我我正在寻找的东西,它返回 ips.ip 值为 X 的任何内容。如果 X 的关联时间戳是该 ips 数组的最高值,我如何仅返回 ip.ip 为 X 的文档?
最佳答案
如果 host
是唯一的,下面的代码应该可以完成这项工作。否则,您可以在分组操作中简单地将 host
替换为 _id
:
coll.aggregate([
{$unwind: "$ips"},
{$project:{host:"$host",ip:"$ips.ip", ts:"$ips.timestamp"} },
{$sort:{ts:1} },
{$group: {_id: "$host", IPOfMaxTS:{$last: "$ip"}, ts:{$last: "$ts"} } }
])