我有一个Contacts集合,其中包含字段,姓名,电子邮件和手机号码,其中包含大约200万条记录(在一段时间内可能达到1000万条)。我想在使用索引时使用$regex
对名称和电子邮件字段进行不区分大小写的搜索。
我在名称和电子邮件字段上都创建了文本索引,但是在这种情况下部分搜索无法正常工作。此外,我还尝试了在名称和电子邮件字段上使用索引,并使用了不区分大小写选项的运算符$regex
,但在这种情况下,两个字段上均未应用索引。
这是我已经尝试过的:
尝试过:{'$text': { $search: searchstring }}
结果:无法搜索部分文本
尝试过:{'name': { $regex: 'searchstring', $options: 'i' }}
尝试过:{'email': { $regex: 'searchstring', $options: 'i' }}
结果:能够搜索部分文本但不使用索引,因此搜索非常慢,无法达到目的
因此,基本上我需要在MongoDB中实现的功能类似于SQL Server中具有1的通配符功能(%)。非常快的搜索速度(拆分秒)2.能够进行部分搜索。
有关SQL Server的示例应如下所示
select * from tblUsers where username like '%amit%'
我们在后端使用NodeJS,在前端使用React。
以下是索引: [ { “ v”:2 “密钥”:{ “ _id”:1 }, “ name”:“ id ”, “ ns”:“联系人” }, { “ v”:2 “密钥”:{ “ companyId”:1.0, “ isDeleted”:1.0, “ _id”:1.0, “列表”:1.0 }, “ name”:“ contacts_cmpId_isdel_id_lists”, “ ns”:“联系人”, “背景”:真实 }, { “ v”:2 “密钥”:{ “ companyId”:1.0, “ isDeleted”:1.0, “ _fts”:“文字”, “ _ftsx”:1 }, “ name”:“ contacts_cmpId_nm_em_mb_unq”, “ ns”:“联系人”, “背景”:是的, “重量”:{ “ emailAddress”:1, “移动”:1 “名称”:1 “ uniqueId”:1 }, “ default_language”:“英语”, “ language_override”:“ language”, “ textIndexVersion”:3 }, { “ v”:2 “密钥”:{ “ companyId”:1.0, “ isDeleted”:1.0, “ emailAddress”:1.0 }, “ name”:“ companyId_1_isDeleted_1_emailAddress_1”, “ ns”:“联系人”, “排序规则”:{ “ locale”:“ en”, “ caseLevel”:false, “ caseFirst”:“ off”, “力量”:2 “ numericOrdering”:false, “ alternate”:“ non-ignorable”, “ maxVariable”:“ punct”, “规范化”:false, “向后”:false, “ version”:“ 57.1” } }, { “ v”:2 “密钥”:{ “ companyId”:1 “已删除”:1, “名称”:1 “列表”:1 “ createdDate”:1 }, “ name”:“ contacts_cmpId_isdel_name_lists_crdt”, “ ns”:“联系人”, “背景”:真实 } ]
这是解释查询
db.getCollection('contacts').find({companyId: ObjectId('5bfcd53c19ebe6727a000d90'), isDeleted: false, 'name': { $regex: 'test1User', $options: 'i' }}).skip(0).limit(100).explain('executionStats')
及其输出:
“ executionStats”:{ “ executionSuccess”:是的, “ nReturned”:1 “ executionTimeMillis”:3634, “ totalKeysExamined”:613865, “ totalDocsExamined”:613840,}
答案 0 :(得分:0)
我假设您正在使用猫鼬,因为标签中已提及猫鼬。 如果是这样,您可以像这样使用正则表达式
UserModel.find({name:new RegExp(nameVariable,"i")}); //"i" makes it case sensitive
尝试它应该可以解决问题