具有跳过和限制的mongodb排序不根据索引对记录进行排序

时间:2016-06-27 09:50:00

标签: mongodb

我正在尝试使用skiplimit对Mongo进行分页。

我想获取按register_time排序的页面记录。在数据库中,记录按索引排序,而不是register_time

如何制作多页记录(多次跳过)遵循相同的register_time订单?

db.collection.aggregate(
[ { "$project" : { "os" : "$os", 
                   "register_time" : "$register_time", 
                   "channel" : "$channel", 
                   "event" : "$event", 
                   "user_id" : "$user_id" } }, 
   { "$match" : { "register_time" : 
                { "$gt" : ISODate("2016-06-23T00:00:00Z"), 
                  "$lt" : ISODate("2050-06-25T23:59:00Z") }, 
                  "event" : "Register_with_number", 
                  "channel" : "001" } }, 
   { "$group" : { "_id" : 
                  { "register_time" : "$register_time", 
                    "user_id" : "$user_id", 
                    "os" : "$os", 
                    "channel" : "$channel" }, 
                  "count" : { "$sum" : 1 } } },
   {"$skip":4},
   {"$limit":10}, 
   { "$sort" :  {"_id.register_time" : -1 } } ])

这是skip结果

 { "_id" : { "register_time" : ISODate("2016-06-24T08:49:36Z"), "user_id" : "65675f96", "os" : "Android", "channel" : "040401" }, "count" : 1 }
 { "_id" : { "register_time" : ISODate("2016-06-24T06:29:56Z"), "user_id" : "f61d0572", "os" : "Android", "channel" : "040401" }, "count" : 1 }
 { "_id" : { "register_time" : ISODate("2016-06-24T04:13:31Z"), "user_id" : "d7d1349d", "os" : "Android", "channel" : "040401" }, "count" : 1 }
 { "_id" : { "register_time" : ISODate("2016-06-24T03:40:13Z"), "user_id" : "ecea2908", "os" : "Android", "channel" : "040401" }, "count" : 1 }

这是第二个skip结果:

{ "_id" : { "register_time" : ISODate("2016-06-24T09:05:13Z"), "user_id" : "6fde06a6", "os" : "Android", "channel" : "040401" }, "count" : 1 }
{ "_id" : { "register_time" : ISODate("2016-06-24T07:47:46Z"), "user_id" : "1e5e5712", "os" : "Android", "channel" : "040401" }, "count" : 1 }
{ "_id" : { "register_time" : ISODate("2016-06-24T05:34:55Z"), "user_id" : "47dfaa32", "os" : "Android", "channel" : "040401" }, "count" : 1 }
{ "_id" : { "register_time" : ISODate("2016-06-24T05:15:03Z"), "user_id" : "70960ae2", "os" : "Android", "channel" : "040401" }, "count" : 1 }

正如您所看到的,这两个页面register_time没有遵循相同的顺序。

如何使不同的页面(跳过)遵循一致的顺序?感谢。

1 个答案:

答案 0 :(得分:2)

您需要在$sort$limit

之前移动$skip

正在执行$limit您正在限制集合中的随机文档,而下一个管道条目则基于随机输入