我正在尝试使用skip
和limit
对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
没有遵循相同的顺序。
如何使不同的页面(跳过)遵循一致的顺序?感谢。
答案 0 :(得分:2)
您需要在$sort
和$limit
$skip
正在执行$limit
您正在限制集合中的随机文档,而下一个管道条目则基于随机输入