如何解决MongoDB查询结合$ text搜索和$ regex
我的难题是mongodb $text
搜索必须与一个确切的单词匹配:例如如果尝试匹配具有'testing123'的帖子,则搜索'test'会不匹配,但使用$regex
会匹配。现在,我也想利用索引,但我也想部分匹配。
我的想法是可以将它们与$or
运算符结合使用,但是它不起作用。这可能吗? $or
内部的每个查询都是有效的,但是将它们组合在一起时却没有匹配项。
如果这不可能,我已经找到了一个很好的解决方案here,但是我希望合并的$or
能够在可行的情况下起作用,但是欢迎其他建议。
const posts = await Post.find({
name: { $regex: 'foo',$options: 'i' },$or: [
{ $text: { $search: text,$caseSensitive: false } },{ text: { $regex: text,$options: 'i' } },],});
解决方法
一种方法是将文本小写到另一个字段,然后对该字段使用$ regex搜索。
您有一些文本要不区分大小写地搜索任何子字符串:
MongoDB Enterprise ruby-driver-rs:PRIMARY> db.foo.insert({foo:'hello world TESTING123'})
WriteResult({ "nInserted" : 1 })
步骤1:添加另一个以小写字母存储文本的字段。
MongoDB Enterprise ruby-driver-rs:PRIMARY> db.foo.insert({foo:'hello world TESTING123',foo_lower:'hello world testing123'})
第2步:添加索引。
MongoDB Enterprise ruby-driver-rs:PRIMARY> db.foo.createIndex({foo_lower:1})
{
"createdCollectionAutomatically" : false,"numIndexesBefore" : 2,"numIndexesAfter" : 3,"commitQuorum" : "votingMembers","ok" : 1,"$clusterTime" : {
"clusterTime" : Timestamp(1597711723,7),"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)
}
},"operationTime" : Timestamp(1597711723,7)
}
第3步:将查询简化为“ testing123”
第4步:使用$ regex。
MongoDB Enterprise ruby-driver-rs:PRIMARY> db.foo.find({foo_lower:{$regex:'testing123'}})
{ "_id" : ObjectId("5f3b2498f885e53d90f30979"),"foo" : "hello world TESTING123","foo_lower" : "hello world testing123" }
MongoDB Enterprise ruby-driver-rs:PRIMARY> db.foo.find({foo_lower:{$regex:'testing123'}}).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,"namespace" : "test.foo","indexFilterSet" : false,"parsedQuery" : {
"foo_lower" : {
"$regex" : "testing123"
}
},"queryHash" : "0D14CC56","planCacheKey" : "1974A2D4","winningPlan" : {
"stage" : "FETCH","inputStage" : {
"stage" : "IXSCAN","filter" : {
"foo_lower" : {
"$regex" : "testing123"
}
},"keyPattern" : {
"foo_lower" : 1
},"indexName" : "foo_lower_1","isMultiKey" : false,"multiKeyPaths" : {
"foo_lower" : [ ]
},"isUnique" : false,"isSparse" : false,"isPartial" : false,"indexVersion" : 2,"direction" : "forward","indexBounds" : {
"foo_lower" : [
"[\"\",{})","[/testing123/,/testing123/]"
]
}
}
},"rejectedPlans" : [ ]
},"serverInfo" : {
"host" : "serene","port" : 14420,"version" : "4.4.0","gitVersion" : "563487e100c4215e2dce98d0af2a6a5a2d67c5cf"
},"$clusterTime" : {
"clusterTime" : Timestamp(1597711761,1),"operationTime" : Timestamp(1597711761,1)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。