sql >> データベース >  >> NoSQL >> MongoDB

Mongodbクエリは、テキストフィールドを持つ複合インデックスのプレフィックスを使用しません

    一般に、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のドキュメントでより明確に強調されているはずです。監視/賛成 DOCS-10322 更新については、MongoDB課題トラッカーで。



    1. MongoDBが日付を挿入すると、UTCに変換されます

    2. DateTimeオブジェクトとYYYY-MM-DD文字列のMongoDBの違い

    3. OSXでのRSpecのロード時間は信じられないほど長い

    4. ClusterControlとそのコンポーネントのパフォーマンスを最適化する方法