运行 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) 运行解释显示全表扫描和 BasicCursor。
对于 d 上的单个索引,explain 显示仅使用 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 文档测试语料库上性能非常慢。