MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongodb-Abfrage verwendet kein Präfix für zusammengesetzten Index mit Textfeld

Im Allgemeinen kann MongoDB Indexpräfixe verwenden, um Abfragen zu unterstützen, zusammengesetzte Indizes mit Geodaten oder Textfeldern sind jedoch ein Sonderfall von sparse zusammengesetzte Indizes . Wenn ein Dokument keinen Wert für eines der Textindexfelder in einem zusammengesetzten Index enthält, wird es nicht in den Index aufgenommen.

Um korrekte Ergebnisse Für eine Präfixsuche wird ein alternativer Abfrageplan über den dünn besetzten zusammengesetzten Index gewählt:

Einrichten einiger Testdaten in MongoDB 3.4.5, um das potenzielle Problem zu demonstrieren:

db.myCollection.createIndex({ user_id:1, name: 'text' }, { name: 'myIndex'})

// `name` is a string; this document will be included in a text index
db.myCollection.insert({ user_id:123, name:'Banana' })

// `name` is a number; this document will NOT be included in a text index
db.myCollection.insert({ user_id:123, name: 456 })

// `name` is missing; this document will NOT be included in a text index
db.myCollection.insert({ user_id:123 })

Erzwingen Sie dann die Verwendung des zusammengesetzten Textindex:

db.myCollection.find({user_id:123}).hint('myIndex')

Das Ergebnis enthält nur das einzelne Dokument mit dem indizierten Textfeld name , statt der drei erwarteten Dokumente:

{
  "_id": ObjectId("595ab19e799060aee88cb035"),
  "user_id": 123,
  "name": "Banana"
}

Diese Ausnahme sollte in der MongoDB-Dokumentation deutlicher hervorgehoben werden; watch/upvote DOCS-10322 im MongoDB Issue Tracker für Updates.