sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB diakritisk känslig sökning visar inte alla rader med accent (ord med diakritiskt tecken) som förväntat och vice versa

Sedan mongodb 3.2 , textindex är diakritiskt okänsliga:

Med version 3 är textindex diakritiskt okänsligt. Det vill säga, indexet skiljer inte mellan tecken som innehåller diakritiska tecken och deras icke-markerade motsvarighet, såsom é, ê och e. Mer specifikt tar textindexet bort de tecken som kategoriseras som diakritiska tecken i Unicode 8.0 Character Database Prop List.

Så följande fråga borde fungera:

db.Collection.find( { $text: { $search: "iphone"} } );
db.Collection.find( { name: { $regex: "iphone"} } );

men det ser ut som att det finns en bugg med diesis ( ¨ ), även om den är kategoriserad som diakritisk i unicode 8.0-listan (problem på JIRA:SERVER-29918 )

Lösning

sedan mongodb 3.4 du kan använda sortering som låter dig utföra den här typen av fråga:

till exempel, för att få din förväntade utdata, kör följande fråga:

db.Collection.find({name: "iphone"}).collation({locale: "en", strength: 1})

detta kommer att mata ut:

{ "_id" : 1, "name" : "iphone" }
{ "_id" : 2, "name" : "iphône" }
{ "_id" : 3, "name" : "iphonë" }
{ "_id" : 4, "name" : "iphônë" }

i sorteringen, strength är jämförelsenivån som ska utföras

  • 1 :endast bastecken
  • 2 :diakritisk känslig
  • 3 :skiftlägeskänslig + diakritisk känslig



  1. Mongo Change Streams körs flera gånger (typ):Nodapp som kör flera instanser

  2. Flera $elemMatch-uttryck för att matcha matrisvärden med $all i MongoDB?

  3. Mongoose kan inte ansluta utan internet

  4. JavaScript-designmönster -- Hanterar oönskad asynkroni