2012-03-16 4 views
22

A.「ネストされた」とそのすべての値をどのようにインデックスするのですか?MongoDBでネストされたインデックスを作成するには?

B.値のインデックスを作成するにはどうすればよいですか? http://www.mongodb.org/display/DOCS/Indexesを、そして私の知識のドキュメントは、ネストされていないインデックスの事について明確ではない:

{ 
    id: 00000, 
    attrs: { 
     nested:{ 
      value: value1, 
      valuetwo: value2, 
     } 
    } 
} 

私はここで見てきました。

答えて

37

あなたはトップレベルのフィールドにインデックスを作成したかのようにそれらを作成したい:

db.collection.ensureIndex({"attrs.nested.value": 1}) 

あなたが明示的に各フィールドにインデックスを作成する必要があります。インデックスへ

1

A.あなたがそれらを個別にインデックスを持つことになります "ネストされた" 内のすべてのプロパティ:

db.collection.createIndex({"attrs.nested.value": 1, "attrs.nested.valuetwo": 1}); 

B:

db.collection.createIndex({"attrs.nested.value": 1}); 
db.collection.createIndex({"attrs.nested.valuetwo": 1}); 

これは、と1つのコマンドで行うことができます。は "valuetwo"にインデックスを設定します:

db.collection.createIndex({"attrs.nested.valuetwo": 1}) 
ensureIndex上

使用createIndex ensureIndexがDeprecated since version 3.0.0

+4

Aで指定した2組の索引作成コマンドは、同等ではありません。最初は 'value'と' valuetwo'に別々のインデックスを作成します。 2つ目は、これらの値の両方に単一の複合インデックスを作成します。このインデックスは 'value'の値を指定するクエリに対してのみ使用できます。つまり、 'valuetwo'だけのクエリでは役に立ちません。 –

2

任意インデックスフィールドが配列の場合のMongoDBは自動的にマルチキーインデックスを作成しているように。明示的にマルチキータイプを指定する必要はありません。

これは、シナリオの db.coll.createIndexの両方のために動作します({ "addr.pin":1})

シナリオ1つのネストされたオブジェクト

{ 
userid:"1234", 
addr: { 
     pin:"455522" 
    } 
}, 
{ 
userid:"1234", 
addr: { 
     pin:"777777" 
    } 
} 

シナリオ2つのネストされた配列

{ 
userid:"1234", 
addr: [ 
    pin:"455522", 
    pin:"777777", 
] 
} 

https://docs.mongodb.com/manual/core/index-multikey/