gpt4 book ai didi

python - MongoDB 大集合搜索慢

转载 作者:可可西里 更新时间:2023-11-01 10:44:21 24 4
gpt4 key购买 nike

我有一个很大的 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"
}

最佳答案

Compound multikey indexes may only include one array field .您的字段 ac 都是数组,您不能创建索引 {c:1,a:-1},但您可以创建索引{c:1}:

db.collection.ensureIndex({c: 1})

此外,考虑使用运算符 $all 在您的查询中,那么您就不需要在字段 c 上创建元素排列。但是,如果您替换 $in $all ,查询返回的元素包含在查询中未指定的其他元素的文档:

{ "_id" : ObjectId("518d51c808beda0b70cffffa"),
"a" : [ 0.00037, 0.00009 ],
"b" : "Some long str",
"c" : [ "element1", "element2", "element3", "element4" ]
}

为防止出现这种情况,您可以结合运算符 $all 与运算符 $size :

results = collection.find({"c": {"$all": query, "$size": len(query)}}).sort("a", -1)

编辑:

正如@Sammaye 所说,对于复合索引,您还有第三种选择。您可以重新设计架构并将 a 字段分解为更多字段,但您需要问问自己什么要在此查询中执行的排序类型。

关于python - MongoDB 大集合搜索慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16519643/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com