Mongo版本:2.6.0
我不确定我是否理解这一点。看起来mongo数据库排序顺序已经以某种方式翻转了我的某个字段?
这是ASCENDING订单排序:
> db.clicks.find({}, {"time": 1}).sort({"time": 1}).limit(1).pretty()
{
"_id" : ObjectId("5367e87fb820307109000cdc"),
"time" : ISODate("2014-05-05T19:37:25Z")
}
和DESCENDING订单排序:
> db.clicks.find({}, {"time": 1}).sort({"time": -1}).limit(1).pretty()
{
"_id" : ObjectId("53607a5bb820301547000242"),
"time" : ISODate("2014-04-30T04:21:31Z")
}
这种翻转只发生在time
字段。
如果我在另一个字段上排序,它可以正常工作:
> db.clicks.find({}, {"lid": 1}).sort({"lid": 1}).limit(1).pretty()
{ "_id" : ObjectId("5363f859b820306ca20002aa"), "lid" : 55960 }
> db.clicks.find({}, {"lid": 1}).sort({"lid": -1}).limit(1).pretty()
{ "_id" : ObjectId("5364488bb8203071090002db"), "lid" : 2074671 }
有什么想法吗?
更新:看起来很奇怪,因为获取更多结果会产生完全随机的顺序。
> db.clicks.find({}, {"time": 1}).sort({"time": 1}).limit(5).pretty()
{
"_id" : ObjectId("5367e87fb820307109000cdc"),
"time" : ISODate("2014-05-05T19:37:25Z")
}
{
"_id" : ObjectId("53618d7eb820306ca200002e"),
"time" : ISODate("2014-04-30T23:55:30Z")
}
{
"_id" : ObjectId("53675870b820307109000876"),
"time" : ISODate("2014-05-05T09:22:48Z")
}
{
"_id" : ObjectId("53642974b820307109000072"),
"time" : ISODate("2014-05-02T23:25:20Z")
}
{
"_id" : ObjectId("535e6a11b8203015470000e5"),
"time" : ISODate("2014-04-28T14:47:25Z")
}
time
是一个索引字段(用于TTL):
> db.clicks.getIndexes()
[
...
{
"v" : 1,
"key" : {
"time" : 1
},
"name" : "time_1",
"ns" : "raw.clicks",
"expireAfterSeconds" : 7776000
}
]
更新2:我删除了索引并重建了它。
> db.clicks.dropIndex({"time": 1})
{ "nIndexesWas" : 10, "ok" : 1 }
> db.clicks.ensureIndex({"time": 1}, {"expireAfterSeconds" : 7776000})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 9,
"numIndexesAfter" : 10,
"ok" : 1
}
仍在进行随机排序。
然后我删除了该集合中的所有文件:
> db.clicks.remove({})
WriteResult({ "nRemoved" : 130 })
并添加新文档并重新查询:
> db.clicks.find({}, {"time": 1}).sort({"time": 1}).limit(5).pretty()
{
"_id" : ObjectId("5367f9a2b820307109000f2e"),
"time" : ISODate("2014-05-05T20:50:36Z")
}
{
"_id" : ObjectId("5367f9ccb820307109000f6f"),
"time" : ISODate("2014-05-05T20:51:04Z")
}
{
"_id" : ObjectId("5367f9b7b820307109000f3d"),
"time" : ISODate("2014-05-05T20:50:54Z")
}
{
"_id" : ObjectId("5367f9b7b820307109000f3e"),
"time" : ISODate("2014-05-05T20:50:58Z")
}
{
"_id" : ObjectId("5367f9b7b820307109000f3f"),
"time" : ISODate("2014-05-05T20:51:00Z")
}
仍有同样的问题。是因为时间上的索引字段是TTL索引吗?
更新3:好的,所以这个特定的mongo服务器出了点问题我无法弄明白。我在另一个mongo服务器上运行查询,查询工作正常(集合和索引相同):
> db.clicks.find({}, {"_id": 0, "time": 1}).sort({"time": 1}).limit(10).pretty()
{ "time" : ISODate("2014-04-25T23:04:57Z") }
{ "time" : ISODate("2014-04-25T23:04:57Z") }
{ "time" : ISODate("2014-04-25T23:04:58Z") }
{ "time" : ISODate("2014-04-25T23:04:59Z") }
{ "time" : ISODate("2014-04-25T23:04:59Z") }
{ "time" : ISODate("2014-04-25T23:04:59Z") }
{ "time" : ISODate("2014-04-25T23:05:03Z") }
{ "time" : ISODate("2014-04-25T23:05:09Z") }
{ "time" : ISODate("2014-04-25T23:05:10Z") }
{ "time" : ISODate("2014-04-25T23:05:10Z") }
> db.clicks.find({}, {"_id": 0, "time": 1}).sort({"time": -1}).limit(10).pretty()
{ "time" : ISODate("2014-05-05T22:30:22Z") }
{ "time" : ISODate("2014-05-05T22:30:19Z") }
{ "time" : ISODate("2014-05-05T22:30:19Z") }
{ "time" : ISODate("2014-05-05T22:30:18Z") }
{ "time" : ISODate("2014-05-05T22:30:16Z") }
{ "time" : ISODate("2014-05-05T22:30:16Z") }
{ "time" : ISODate("2014-05-05T22:30:16Z") }
{ "time" : ISODate("2014-05-05T22:30:15Z") }
{ "time" : ISODate("2014-05-05T22:30:14Z") }
{ "time" : ISODate("2014-05-05T22:30:13Z") }
答案 0 :(得分:0)
你有这个领域的索引吗?
除非您拥有指定键模式的索引,否则请使用$ orderby 与$ maxScan和/或cursor.limit()一起使用以避免要求 MongoDB执行大内存排序。
来自:http://docs.mongodb.org/manual/reference/operator/meta/orderby/