首先,让我介绍一下我的用例-我有一个collection
with文档,用于存储XMLrequest
和对应response
的XML 。此外,每个文档都有大量附带的属性,其中一些已被索引,但请求和响应却没有。
每当我使用索引字段进行搜索时,性能就足够了。但是在某些情况下,我必须根据请求或响应值使用正则表达式准备搜索。
现在,我做这样的事情:
db.traffic.find(
{ $or:
[ { request: { $regex: "some.* code=\"123\"} },
{ response: { $regex: "some.* code=\"123\"} }] })
然后将其翻译成Java代码。但是查询速度很慢,并且与其他查询相比需要花费大量时间。
我可以看到两种解决方案:
request
s和response
s-但我认为这不是一个好主意,因为它们确实很长,而且很有可能索引很大。indexed
首先使用某个字段进行查询,然后应用已提到的查询,但是以找到的记录的降序排列,并选择第一个找到的记录,因此我想执行以下操作
db.traffic.find({"conversationID": { $regex: "vendorName" }}).sort({"counter": -1})
.findOne(
{ $or:
[ { request: { $regex: "some.* code=\"123\"} },
{ response: { $regex: "some.* code=\"123\"} }] })
总结一下-我的问题是:我应该选择索引request
s和response
s的简单解决方案吗?它将对我的索引大小产生什么影响?
还是我应该选择第二种方式?但是我的代码正确吗,是我想要的吗?
最后,我尝试了第二种解决方案,但由于无法findOne
在查询结果上运行,因此对其进行了少许更改。但是我发现了等效的语法。
所以现在看起来像这样:
db.traffic.findOne($query: { $or:
[ { request: { $regex: "some.* code=\"123\"} },
{ response: { $regex: "some.* code=\"123\"} }] },
$orderby: { "counter": -1})
而且现在的性能要好得多。
我也曾经explain
检查过真正的“速度”。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句