Mongodb 如何在集合中查找和限制之前进行排序?

Mongodb 如何在集合中查找和限制之前进行排序?,mongodb,pymongo,Mongodb,Pymongo,pymongo的哪个方法首先执行排序或限制 我有一个大的收藏,我需要筛选特定的折扣类别(“X”),例如: 但是查询必须通过折扣值过滤所有文档检索较大的文档,假设我需要将查询限制为2: .find({"category": {"$in": ["X"]}}) .limit(2) .sort("discount_value", pymongo.DESCENDING) 这个示例将给我折扣值1和10,但我需要的是10和15,我如何在限制(如果可能)之前进行排序而不损失性能(集合非常大)sort()首先应

pymongo的哪个方法首先执行<代码>排序或
限制

我有一个大的收藏,我需要筛选特定的折扣类别(“X”),例如:

但是查询必须通过
折扣值过滤所有文档
检索较大的文档,假设我需要
将查询限制为2:

.find({"category": {"$in": ["X"]}})
.limit(2)
.sort("discount_value", pymongo.DESCENDING)
这个示例将给我折扣值1和10,但我需要的是10和15,我如何在限制(如果可能)之前进行排序而不损失性能(集合非常大)

sort()
首先应用,然后再应用
limit

向下滚动到此文档:

以下语句链接游标方法limit()和sort():

db.bios.find().sort({name:1}).limit(5)

db.bios.find().limit(5 ).sort({name:1})

这两种说法是等价的;i、 e.您连锁的顺序 limit()和sort()方法不重要。两种说法 返回由升序排序确定的前五个文档 按“姓名”订购

排序顺序测试

实际上,排序对我来说是正确的。在Ubuntu 18.04服务器上使用
MongoDB shell v3.6.3版
,我加载了如下文件:

[{"discount_value": 1, "name": "promotion_1", "category": ["X"]},
{"discount_value": 10, "name": "promotion_10", "category": ["X", "Y"]},
{"discount_value": 15, "name": "promotion_15", "category": ["X", "Y", "Z"]}]
使用
mongoimport--db test--collection test1--drop--file testing.txt--jsonArray

在mongo提示符下,我尝试查找折扣值并按其降序排序,结果发现15位于顶部

> db.test1.find({"category": {"$in": ["X"]}}).sort( {discount_value: -1} )
{ "_id" : ObjectId("5cb4beefea2d524413d8df57"), "discount_value" : 15, "name" : "promotion_15", "category" : [ "X", "Y", "Z" ] }
{ "_id" : ObjectId("5cb4beefea2d524413d8df56"), "discount_value" : 10, "name" : "promotion_10", "category" : [ "X", "Y" ] }
{ "_id" : ObjectId("5cb4beefea2d524413d8df55"), "discount_value" : 1, "name" : "promotion_1", "category" : [ "X" ] }
极限测试

请注意,
limit
sort
之前或之后如何在输出中没有差异

排序后的限制与排序前的限制给出相同的结果

> db.test1.find({"category": {"$in": ["X"]}}).sort( {discount_value: -1} ).limit(2)
{ "_id" : ObjectId("5cb4beefea2d524413d8df57"), "discount_value" : 15, "name" : "promotion_15", "category" : [ "X", "Y", "Z" ] }
{ "_id" : ObjectId("5cb4beefea2d524413d8df56"), "discount_value" : 10, "name" : "promotion_10", "category" : [ "X", "Y" ] }
vs

排序性能

我能告诉您的最好方法是按照手册中的建议使用索引,并使用explain来了解您的工作负载中存在的查询瓶颈

> db.test1.find({"category": {"$in": ["X"]}}).sort( {discount_value: -1} ).limit(2)
{ "_id" : ObjectId("5cb4beefea2d524413d8df57"), "discount_value" : 15, "name" : "promotion_15", "category" : [ "X", "Y", "Z" ] }
{ "_id" : ObjectId("5cb4beefea2d524413d8df56"), "discount_value" : 10, "name" : "promotion_10", "category" : [ "X", "Y" ] }
> db.test1.find({"category": {"$in": ["X"]}}).limit(2).sort( {discount_value: -1} )
{ "_id" : ObjectId("5cb4beefea2d524413d8df57"), "discount_value" : 15, "name" : "promotion_15", "category" : [ "X", "Y", "Z" ] }
{ "_id" : ObjectId("5cb4beefea2d524413d8df56"), "discount_value" : 10, "name" : "promotion_10", "category" : [ "X", "Y" ] }