【发布时间】:2013-05-13 10:17:39
【问题描述】:
我有大型 mongodb 集合(530 万个条目),每个条目都有列表字段和一些附加字段。例如:
{ "_id" : ObjectId("518d51c808beda0b70cffffa"),
"a" : [ 0.00037, 0.00009 ],
"b" : "Some long str",
"c" : [ "element1", "element2", "element3" ]
}
我在字段c 上有索引,我想对其进行搜索。此外,我想按此列表的所有排列进行搜索,例如,我希望上面的对象出现在查询 "c": ["element3", "element2", "element1"] 的搜索结果中。
我是这样使用pymongo的:
from itertools import permutations
...
query = ['element1', 'element2', 'element3']
query_permutations = list(permutations(query, len(query)))
results = collection.find({"c": {"$in": query_permutations}}).sort("a", -1)
有什么方法可以让它更快?
UPD:在较小版本的集合上解释():
{
"cursor" : "BasicCursor",
"isMultiKey" : false,
"n" : 11053,
"nscannedObjects" : 11053,
"nscanned" : 11053,
"nscannedObjectsAllPlans" : 11053,
"nscannedAllPlans" : 11053,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 41,
"indexBounds" : {
},
"server" : "machine.local:27017"
}
【问题讨论】:
-
你能给我们一个explain()吗?集合上的索引是什么?
-
是的,该查询没有使用索引,您可能想添加
{c:1,a:-1}或者如果 mongo 优化器会看到它{a:-1,c:1}但我不确定优化器是否会看到后一个索引,但它会一个基本排序的 $in range -
@Sammaye 出现错误
cannot index parallel arrays [c] [a] -
a是数组类型?编辑:愚蠢的我,我没有看问题顶部的文档结构 -
我不确定
a上的排序会有多大用处,您希望完成什么?