为什么mongo升序/降序排序顺序为Date字段翻转?

时间:2014-05-05 19:55:07

标签: mongodb sorting

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

1 个答案:

答案 0 :(得分:0)

你有这个领域的索引吗?

  

除非您拥有指定键模式的索引,否则请使用$ orderby   与$ maxScan和/或cursor.limit()一起使用以避免要求   MongoDB执行大内存排序。

来自:http://docs.mongodb.org/manual/reference/operator/meta/orderby/