我想在mongo中匹配多个开始字符串。 explain()显示它正在使用此查询的索引字段索引:
db.mycol.find({indexedfield:/^startstring/,nonindexedfield:/somesubstring/});
但是,对多个起始字符串的以下查询实际上很慢。当我运行解释时,我得到一个错误。从我在mongostat(每秒7k)中可以看到的故障来看,它正在扫描整个系列。它也在每隔几秒锁定0%和90-95%之间交替。
db.mycol.find({indexedfield:/^(startstring1|startstring2)/,nonindexedfield:/somesubstring/}).explain();
JavaScript execution failed: error: { "$err" : "assertion src/mongo/db/key.cpp:421" } at src/mongo/shell/query.js:L128
任何人都可以了解我如何做到这一点或导致解释错误的原因?
更新 - 更多信息
好的,所以我设法通过限制结果的数量来解释更复杂的查询。区别在于:
对于单个子字符串,“^ / BA1 /”(是的,它是邮政编码)
"cursor" : "BtreeCursor pc_1 multi",
"isMultiKey" : false,
"n" : 10,
"nscannedObjects" : 10,
"nscanned" : 10,
"nscannedObjectsAllPlans" : 19,
"nscannedAllPlans" : 19,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
"indexedfield" : [
[
"BA1",
"BA2"
],
[
/^BA1/,
/^BA1/
]
]
}
对于多个子串“^(BA1 | BA2)/”
"cursor" : "BtreeCursor pc_1 multi",
"isMultiKey" : false,
"n" : 10,
"nscannedObjects" : 10,
"nscanned" : 1075276,
"nscannedObjectsAllPlans" : 1075285,
"nscannedAllPlans" : 2150551,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 5,
"nChunkSkips" : 0,
"millis" : 4596,
"indexBounds" : {
"indexedfield" : [
[
"",
{
}
],
[
/^(BA1|BA2)/,
/^(BA1|BA2)/
]
]
}
看起来不太好。
答案 0 :(得分:0)
$或解决使用索引方面的问题(感谢EddieJamsession)。现在查询速度很快。
db.mycoll.find({$or: [{indexedfield:/^startstring1/},{indexedfield:/^startstring2/],nonindexedfield:/somesubstring/})
但是,如果可能的话,我仍然希望使用正则表达式进行此操作,因此我将问题保持打开状态。尤其是因为我现在必须重构我的应用程序以考虑这些类型的查询。