MongoDB在Aggregate中$limit与$skip位置
2018-11-01 本文已影响2人
一个菜鸟JAVA
数据准备
{ "_id" : ObjectId("5bdac3aa370b331d24e7fbc2"), "value" : 1 }
{ "_id" : ObjectId("5bdac3d7370b331d24e7fbc5"), "value" : 2 }
{ "_id" : ObjectId("5bdac3e2370b331d24e7fbc7"), "value" : 3 }
{ "_id" : ObjectId("5bdac3ea370b331d24e7fbc9"), "value" : 4 }
{ "_id" : ObjectId("5bdac3f3370b331d24e7fbcb"), "value" : 5 }
普通查询
#查询语句
db.test.find().limit(3).skip(2);
db.test.find().skip(2).limit(3);
#结果
// 2018/11/1 17:26:15
// Command #1:
// db.test.find().limit(3).skip(2);
// Execution time: 0.0s
// Result:
{ "_id" : ObjectId("5bdac3e2370b331d24e7fbc7"), "value" : 3 }
{ "_id" : ObjectId("5bdac3ea370b331d24e7fbc9"), "value" : 4 }
{ "_id" : ObjectId("5bdac3f3370b331d24e7fbcb"), "value" : 5 }
// 2018/11/1 17:26:15
// Command #2:
// db.test.find().skip(2).limit(3);
// Execution time: 0.1s
// Result:
{ "_id" : ObjectId("5bdac3e2370b331d24e7fbc7"), "value" : 3 }
{ "_id" : ObjectId("5bdac3ea370b331d24e7fbc9"), "value" : 4 }
{ "_id" : ObjectId("5bdac3f3370b331d24e7fbcb"), "value" : 5 }
skip和limit未知交换并不会影响查询结果
Aggregate
#查询语句
db.test.aggregate([
{"$sort":{"value":1}},
{"$skip":2},
{"$limit":2}
]);
db.test.aggregate([
{"$sort":{"value":1}},
{"$limit":3},
{"$skip":2}
]);
#结果
// 2018/11/1 17:29:10
// Command #1:
// db.test.aggregate([
// {"$sort":{"value":1}},
// {"$skip":2},
// {"$limit":2}
// ]);
// Execution time: 0.0s
// Result:
{ "_id" : ObjectId("5bdac3e2370b331d24e7fbc7"), "value" : 3 }
{ "_id" : ObjectId("5bdac3ea370b331d24e7fbc9"), "value" : 4 }
// 2018/11/1 17:29:10
// Command #2:
// db.test.aggregate([
// {"$sort":{"value":1}},
// {"$limit":3},
// {"$skip":2}
// ]);
// Execution time: 0.0s
// Result:
{ "_id" : ObjectId("5bdac3e2370b331d24e7fbc7"), "value" : 3 }
可以发现两次查询的结果不一样
小结
在Aggregate中,$limit
和$skip
位置不同是会影响最终结果的.
如果$limit
在前$skip
在后,表示先取limit条记录,然后跳过前skip条数记录
如果$skip
在前$limit
在后,表示先跳过skip条记录,然后取limit条数记录