在查找和限制集合之前如何排序?

时间:2019-04-15 16:51:24

标签: mongodb pymongo

pymongo的哪个方法首先执行? sort还是limit

我的收藏很大,需要过滤特定的折扣类别(“ X”),例如:

{"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"]}

但是查询必须通过discount_values检索较大的文档来过滤所有文档,可以说我需要在limit的2之前进行查询:

.find({"category": {"$in": ["X"]}})
.limit(2)
.sort("discount_value", pymongo.DESCENDING)

此示例将为我提供折扣值1和10,但是我需要的折扣值为10和15,如何在限制之前(如果可能)进行排序而又不损失性能(集合很大)

1 个答案:

答案 0 :(得分:1)

sort()首先被应用,然后是limit

向下滚动到此文档:https://docs.mongodb.com/manual/reference/method/db.collection.find/

  

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

     

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

     

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

     

这两个语句是等效的;即您链接的顺序   limit()和sort()方法并不重要。两种说法   返回由升序确定的前五个文档   在“名称”上订购。

排序订单测试

排序实际上对我来说是正确的。在Ubuntu 18.04服务器上使用MongoDB shell version 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提示符下,我尝试查找Discount_value降序并对其进行排序,发现顶部有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。

> 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" ] }

排序效果

我能告诉你的最好的方法是按照手册https://docs.mongodb.com/manual/tutorial/sort-results-with-indexes/中的建议使用索引,并使用explain来了解使用https://docs.mongodb.com/manual/reference/method/db.collection.explain/#db.collection.explain的这种工作负载在哪里存在查询瓶颈