mongodb - 如何在 mongo 中为处理子字符串、不区分大小写和不区分变音符号的指定字段查找文档
问题描述
我正在尝试在 mongo (4.2) 中执行查找查询,该查询返回单个指定字段的匹配项,该字段可以处理子字符串匹配、不区分大小写的匹配和变音符号匹配。
(查询最终将使用 js/express 执行,但我不认为这是相关的 - 使用 shell 的示例)
我找到了各种解决方案来查找此标准的子集,但对所有这些都没有。
假设一个集合:
db.stuff = [
{ name: "Björn Smith", city: "Örebro"},
{ name: "John Franzén", city: "Norrköping"}
{ name: "Henry Jones", city: "Smith Town"}
]
我希望能够找到:
- 第一条记录使用:name = 'bjorn' (substring + insensitive + diacritic)
- 使用 city = 'norrko' 的第二个查询(子字符串 + 不敏感 + 变音符号)
- 并且仅在搜索 name = 'smith' 时找到第一条记录($text 将返回 2 个结果)
方法一:整理
适用于变音符号
db.stuff.find({name: 'Bjorn Smith'}).collation({ locale: 'en', strength: 1 })
不适用于子字符串
db.stuff.find({name: 'Bjorn'}).collation({ locale: 'en', strength: 1 })
方法2:带有排序规则的正则表达式
适用于子字符串
db.stuff.find({name: {$regex: 'Björn'}}).collation({ locale: 'en', strength: 1 })
不适用于变音符号
db.stuff.find({name: {$regex: 'Bjorn'}}).collation({ locale: 'en', strength: 1 })
方法三:indexOfCP
(信用:https ://stackoverflow.com/a/56808870 )
适用于子字符串
db.stuff.find({ $expr: { $gt: [{ $indexOfCP: [ { $toLower: '$name' }, 'björn'] }, -1] } }).collation({ locale: 'en', strength: 1 })
对变音符号不起作用
db.stuff.find({ $expr: { $gt: [{ $indexOfCP: [ { $toLower: '$name' }, 'bjorn'] }, -1] } }).collation({ locale: 'en', strength: 1 })
方法四:$文本
这适用于子字符串和变音符号,但我希望能够指定我正在搜索的字段,这利用索引来搜索所有字段
适用于变音符号
db.stuff.createIndex( { name: "text", city: "text" } )
db.stuff.find({$text: {$search: 'Bjorn'}})
不适用于单词中的子字符串
db.stuff.find({$text: {$search: 'Bjo'}})
跨多个字段返回太多结果
db.stuff.find({$text: {$search: 'Smith'}})