ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

python-MongoDB优化FindAndModify或查找排序

2019-11-27 18:55:26  阅读:481  来源: 互联网

标签:mongodb pymongo python database


运行MongoDB,我正在尝试将优先级为(d)的三列键查找(a,b,c)排队.我有一个查询(pymongo语法):

collection.find({'a':'foo','b':'bar','c':'baz'}, sort = [('d', -1)] )

在运行复合索引(a 1,b 1,c 1,d-1)的情况下,explain显示全表扫描和BasicCursor.

在d上有一个索引时,说明显示仅使用d索引.

对于大表,我真正想要的是使用复合索引.我该如何进行这项工作?

INDEX_INFORMATION:
{u’id’:{u’key’:[(u’_id’,1)],u’v’:1},
 u’color_1_level_1_in_progress_1_Ranking_-1’:{u’key’:[(u’color’,
    1),
   (u’level’,1),
   (u’in_progress’,1),
   (u’Ranking’,-1)],
  u’v’:1}}

EXPLAIN ON A FIND+SORT QUERY
db.coll.find({'level' : {'$in' : [0,1,2]}, 'in_progress' : 0, 'color' : {'$in' : ['Red', 'Blue', 'Green]} },  sort = [('Ranking', -1)] ).explain()

OUTPUT ON EXPLAIN
OperationFailure: database error: too much data for sort() with no index.  add an index or specify a smaller limit


THE QUEUEING QUERY I CARE ABOUT OPTIMIZING
coll.find_and_modify(
  query = {'level' : {'$in' : [0,1,2]}, 'in_progress' : 0, 'color' : {'$in' : ['Red', 'Blue', 'Green']} },
  sort = {'Ranking' : -1},                                                                                                                                                                             
  update = {'$set': {'in_progress': 1}} 
)   

请注意,当我在“排名”字段上添加索引时,说明会返回正在使用排名索引.但是,复合索引从未使用过,并且在1.5 MM文档测试语料库上的性能非常低.

解决方法:

有一种在执行查询时强制使用特定索引的方法,称为提示.

只需在游标上调用它即可:

cursor = collection.find({query-doc}).hint({index-fields})

标签:mongodb,pymongo,python,database
来源: https://codeday.me/bug/20191127/2076519.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有