Java 核心技术

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条数记录

上一篇 下一篇

猜你喜欢

热点阅读