【发布时间】:2016-01-05 17:26:12
【问题描述】:
我有以下查询 - 大约需要 20-40 秒才能完成(同一集合上没有 RegEx 的类似查询最多需要几毫秒):
var filter = Builders<BsonDocument>.Filter.Regex("DescriptionLC", new BsonRegularExpression(descriptionStringToFindFromCallHere, "i"));
var mongoStuff = GetMongoCollection<BsonDocument>(MongoConstants.StuffCollection);
var stuff = await mongoStuff
.Find(filter)
.Limit(50)
.Project(x => Mapper.Map<BsonDocument, StuffViewModel>(x))
.ToListAsync();
我看到answer here 似乎暗示使用以下格式(逐字复制)此查询会更快:
var names = namesCollection.AsQueryable().Where(name =>
name.FirstName.ToLower().Contains("hamster"));
但是,该项目使用的是 MongoDb .NET Driver 2.0 和 doesn't support LINQ。所以,我的问题归结为:
一)。使用 LINQ 会明显更快,还是差不多?我可以更新到 1,但我宁愿不更新。
乙)。我能做些什么来加快速度吗?我已经在寻找仅小写的字段了。
------------结束原帖------------
编辑:通过将 .Limit(50) 更改为 .Limit(5) 来减少返回的“东西”数量,从而线性减少了调用时间。后者的 40 秒下降到 4,我尝试了不同的数字,这似乎是直接相关的。这对我来说很奇怪,但我真的不明白它是如何工作的。
编辑 2:似乎唯一的解决方案可能是使用“开始于”而不是“包含”正则表达式。根据docs(“索引使用”部分),显然后者没有有效地使用索引。
编辑3:最后,我做了三件事(字段已经被索引):
1)。减少返回的结果数量 - 这极大地帮助了返回的项目数量与调用所用时间之间的线性相关性。
2)。将搜索更改为仅小写 - 这仅略有帮助。
3)。将正则表达式更改为仅搜索“开始于”而不是“包含”,同样,这几乎没有帮助,对此的更改是:
//Take the stringToSearch and make it into a "starts with" RegEx
var startingWithSearchRegEx = "^" + stringToSearch;
然后将其传递给新的 BsonRegularExpression 而不仅仅是搜索字符串。
仍在寻找任何反馈!
【问题讨论】:
-
您有关于 DescriptionLC 的索引吗?
-
@Jaco 刚刚仔细检查过——我愿意。
-
collection 有多少条记录?
-
@mofenko 抱歉,我有一段时间没有检查了。该集合有数万到数十万条记录。
标签: mongodb mongodb-query mongodb-.net-driver