python-MongoDB优化FindAndModify或查找排序

运行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})
上一篇:python-将二进制数据插入pymongo中的Mongo字段


下一篇:python-如何获取集合内嵌套项目的值?