首页 > 解决方案 > 如何在 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"}
]

我希望能够找到:

方法一:整理

适用于变音符号

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'}})

标签: mongodbmongodb-query

解决方案


推荐阅读