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,如何在限制之前(如果可能)进行排序而又不损失性能(集合很大)
答案 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的这种工作负载在哪里存在查询瓶颈