Mongodb 如何在mongo中查找处理子字符串的指定字段的文档,不区分大小写,不区分重音

Mongodb 如何在mongo中查找处理子字符串的指定字段的文档,不区分大小写,不区分重音,mongodb,mongodb-query,Mongodb,Mongodb Query,我试图在mongo(4.2)中执行一个查找查询,该查询返回单个指定字段的匹配,该字段可以处理子字符串匹配、不区分大小写的匹配和变音符匹配 (查询最终将使用js/express执行,但我认为这与此无关——使用shell的示例) 我已经找到了各种各样的方法来寻找这个标准的子集,但是对于所有的方法都没有 假设集合: db.stuff = [ { name: "Björn Smith", city: "Örebro"}, { name: "John Franzén", city: "Norrköpi

我试图在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'(子字符串+不敏感+变音符号)
  • 第二个查询使用city='norrko'(子字符串+不敏感+变音符号)
  • 并且在搜索name='smith'时仅查找第一条记录($text将返回2个结果)
方法1:整理 适用于变音符号

db.stuff.find({name: 'Bjorn Smith'}).collation({ locale: 'en', strength: 1 })
db.stuff.find({name: {$regex: 'Bjorn'}}).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({name: 'Bjorn'}).collation({ locale: 'en', strength: 1 })
db.stuff.find({name: {$regex: 'Björn'}}).collation({ locale: 'en', strength: 1 })
db.stuff.find({ $expr: { $gt: [{ $indexOfCP: [ { $toLower: '$name' }, 'björn'] }, -1] } }).collation({ locale: 'en', strength: 1 })
db.stuff.find({$text: {$search: 'Smith'}})
方法2:带有排序规则的regexp 适用于子字符串

db.stuff.find({name: 'Bjorn'}).collation({ locale: 'en', strength: 1 })
db.stuff.find({name: {$regex: 'Björn'}}).collation({ locale: 'en', strength: 1 })
db.stuff.find({ $expr: { $gt: [{ $indexOfCP: [ { $toLower: '$name' }, 'björn'] }, -1] } }).collation({ locale: 'en', strength: 1 })
db.stuff.find({$text: {$search: 'Smith'}})
不适用于变音符号

db.stuff.find({name: 'Bjorn Smith'}).collation({ locale: 'en', strength: 1 })
db.stuff.find({name: {$regex: 'Bjorn'}}).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'}})
方法3:indexOfCP (信用证:)

适用于子字符串

db.stuff.find({name: 'Bjorn'}).collation({ locale: 'en', strength: 1 })
db.stuff.find({name: {$regex: 'Björn'}}).collation({ locale: 'en', strength: 1 })
db.stuff.find({ $expr: { $gt: [{ $indexOfCP: [ { $toLower: '$name' }, 'björn'] }, -1] } }).collation({ locale: 'en', strength: 1 })
db.stuff.find({$text: {$search: 'Smith'}})
不适用于变音符号

db.stuff.find({name: 'Bjorn Smith'}).collation({ locale: 'en', strength: 1 })
db.stuff.find({name: {$regex: 'Bjorn'}}).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'}})
方法4:$text 这适用于子字符串和变音符号,但我希望能够指定要搜索的字段,这将利用索引来搜索所有字段

适用于变音符号

db.stuff.find({name: 'Bjorn Smith'}).collation({ locale: 'en', strength: 1 })
db.stuff.find({name: {$regex: 'Bjorn'}}).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({name: 'Bjorn'}).collation({ locale: 'en', strength: 1 })
db.stuff.find({name: {$regex: 'Björn'}}).collation({ locale: 'en', strength: 1 })
db.stuff.find({ $expr: { $gt: [{ $indexOfCP: [ { $toLower: '$name' }, 'björn'] }, -1] } }).collation({ locale: 'en', strength: 1 })
db.stuff.find({$text: {$search: 'Smith'}})