db.collection.aggregate(
{ "$match" : {
"key" : "mykey"
}
},
{
"$sort" : {
"time" : -1
}
},
{
"$limit" : 1
}
)
示例文档:
{
key: "key1",
time: ISODate("2014-07-04T20:04:46.904Z")
}
索引
"time" : -1
"key" : 1,
"_id" : 1
当集合中存在“mykey”时,查询需要30ms,当“mykey”不存在时需要10s, 解释告诉我使用了索引。 这是一个有上限的集合,因此通常会发生缺少“密钥”的情况。 为什么需要这么长时间。 顺便说一句。 Mongodb 2.4
进一步探索:
删除排序索引会缩短查找时间:
解释在sort字段上有和没有索引的聚合表明,对于索引,排序在管道开始时执行,没有排序索引它将作为管道的最后一步执行
答案 0 :(得分:0)
您的查询在key
上是相等的,并在time
上排序,这意味着您使用了错误的索引(您的索引本质上是time:1, key:1
)。
您正在运行的查询的字段顺序应为key:1, time:1
(作为前两个字段),以便从中获得有效帮助。使用该索引,可以直接跳转匹配的key
值,然后如果time
有多个key
值,则对它们进行排序,并且可以立即获取最高值。如果在索引中找不到key
,那么就完成了。
实际上,查询被强制扫描索引(前导字段)中的所有时间值,这样当您找到第一个匹配的键时,您将能够返回。当您要查找的密钥不存在时,查询最终会扫描整个索引,然后才能返回。