给定一个包含文档的集合,例如:

{
    "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"} } }
])

10-06 13:17