sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongodb-frågan använder inte prefix på sammansatt index med textfält

I allmänhet kan MongoDB använda indexprefix för att stödja frågor, men sammansatta index inklusive geospatiala eller textfält är ett specialfall av glesa sammansatta index . Om ett dokument inte innehåller ett värde för något av textindexfälten i ett sammansatt index, kommer det inte att inkluderas i indexet.

För att säkerställa korrekta resultat för en prefixsökning kommer en alternativ frågeplan att väljas framför det sparsamma sammansatta indexet:

Konfigurera några testdata i MongoDB 3.4.5 för att visa det potentiella problemet:

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

Sedan tvingar du det sammansatta textindexet att användas:

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

Resultatet inkluderar endast det enskilda dokumentet med det indexerade textfältet name , snarare än de tre dokument som kan förväntas:

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

Detta undantag bör tydligare markeras i MongoDB-dokumentationen; titta/rösta upp DOCS-10322 i MongoDB issue tracker för uppdateringar.



  1. Beräknade gruppvisa fält i MongoDB

  2. Hur återställer man en tappad MongoDB-databas?

  3. MongoDB:schemamigrering, uppdatering eller infogning

  4. MongoDB - Skillnad mellan index på textfält och textindex?