3

私は初めてMongoDBです。デフォルトでは、コレクションのフィールドにmongodbインデックス_idがあります。Java を使用して、さらに 2 つのフィールドにインデックスを作成する必要があります。

DBObject indexOptions = new BasicDBObject();
indexOptions.put(field_1, 1);
indexOptions.put(field_2, -1);
collection.createIndex(indexOptions )

db.collection_name.getIndexes() を使用してmongodbでクエリを実行すると

[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "schema.collection_name"
        },
        {
                "v" : 1,
                "key" : {
                        "field_1" : 1,
                        "field_2" : -1
                },
                "name" : "field_1_1_field_2_-1",
                "ns" : "schema.collection_name"
        }
]

上記が正しいかどうかはわかりません。誰か確認してくれませんか?正しくない場合、どうすれば修正できますか?

上記に加えて、検索のために私は次のようなことをしています:

        DBObject subscriberIdObj = new BasicDBObject( field3, value3 );
        DBObject subscriberIdIsNullObj = new BasicDBObject( field3, null );
        BasicDBList firstOrValues = new BasicDBList();
        firstOrValues.add( subscriberIdObj );
        firstOrValues.add( subscriberIdIsNullObj );
        DBObject firstOr = new BasicDBObject( "$or", firstOrValues );

        DBObject batchIdObj = new BasicDBObject( field1, value1 );
        DBObject fileNameObj = new BasicDBObject( field2, value2 );
        BasicDBList secondOrValues = new BasicDBList();
        secondOrValues.add( batchIdObj );
        secondOrValues.add( fileNameObj );
        DBObject secondOr = new BasicDBObject( "$or", secondOrValues );
        BasicDBList andValues = new BasicDBList();
        andValues.add( firstOr );
        andValues.add( secondOr );

        DBObject query = new BasicDBObject( "$and", andValues );
        DBCursor cursor = mongoDatastore.getDB().getCollection(collection_name).find(query);

さて、上記のように高速に検索するには、field1、field2、および field3 に個別にインデックスを作成する必要がありますか? または3つのフィールドすべての複合インデックス?

4

1 に答える 1

4

これは正しく、 と呼ばれCompound Indexます。field_1(昇順) とfield_2(降順)の 2 つのフィールドにインデックスを作成しました。たとえば、field_1昇順とfield_2降順、またはfield_1降順とfield_2昇順で並べ替える場合、MongoDb はこのインデックスfield_1_1_field_2_-1を使用します。

ただし、上記のインデックスは、昇順の値による並べ替えと昇順のfield_1値による並べ替えをサポートしていませんfield_2。また、 のみで検索またはソートする場合field_2、このインデックスは使用されません。この場合、 と に個別のインデックスを作成できfield_1ますfield_2

クエリがインデックスを使用しているかどうかを確認するには、使用してみて、explain()どのカーソルが使用されているかを確認してください。たとえば、次のようなクエリを試すことができます。

db.your_collection.find({ "field_1" : "something" }).explain()

使用されているカーソルが であることがわかる場合BtreeCursor、クエリはインデックスを使用しますが、そうでBasicCursorない場合はそれを使用します。

詳細については、この記事を参照してください。

于 2014-09-10T05:50:22.570 に答える