sql >> Database teknologi >  >> NoSQL >> MongoDB

Mongodb-forespørgsel bruger ikke præfiks på sammensat indeks med tekstfelt

Generelt kan MongoDB bruge indekspræfikser til at understøtte forespørgsler, men sammensatte indekser inklusive geospatiale felter eller tekstfelter er et specialtilfælde af sparsomme sammensatte indekser . Hvis et dokument ikke indeholder en værdi for nogen af ​​tekstindeksfelterne i et sammensat indeks, vil det ikke blive inkluderet i indekset.

For at sikre korrekte resultater for en præfikssøgning vil en alternativ forespørgselsplan blive valgt frem for det sparsomme sammensatte indeks:

Opsætning af nogle testdata i MongoDB 3.4.5 for at demonstrere det potentielle problem:

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

Tving derefter det sammensatte tekstindeks til at blive brugt:

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

Resultatet inkluderer kun det enkelte dokument med det indekserede tekstfelt name , snarere end de tre dokumenter, der kunne forventes:

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

Denne undtagelse bør tydeligere fremhæves i MongoDB-dokumentationen; watch/upvote DOCS-10322 i MongoDB issue tracker for opdateringer.



  1. mongodb:Multikey-indekseringsstruktur?

  2. MongoDB $split

  3. serverinstanspuljen blev ødelagt

  4. Node mongoose find forespørgsel i loop virker ikke