一般に、MongoDBはインデックスプレフィックスを使用してクエリをサポートできますが、地理空間フィールドやテキストフィールドを含む複合インデックスは、スパース複合インデックス 。ドキュメントに複合インデックスのテキストインデックスフィールドの値が含まれていない場合、そのドキュメントはインデックスに含まれません。
正しい結果 プレフィックス検索の場合、スパース複合インデックスよりも代替クエリプランが選択されます:
潜在的な問題を実証するために、MongoDB 3.4.5でいくつかのテストデータを設定します:
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 })
次に、複合テキストインデックスを強制的に使用します:
db.myCollection.find({user_id:123}).hint('myIndex')
結果には、インデックス付きテキストフィールドname
を持つ単一のドキュメントのみが含まれます 、予想される3つのドキュメントではなく:
{
"_id": ObjectId("595ab19e799060aee88cb035"),
"user_id": 123,
"name": "Banana"
}
この例外は、MongoDBのドキュメントでより明確に強調されているはずです。監視/賛成