1

2.2のMongoShardキーのドキュメントを読んでいたところ、少し混乱しました。

すべてのシャードコレクションには、シャードキーで始まるインデックスが必要です。まだドキュメントが含まれておらず、そのようなインデックスがないコレクションをシャードすると、shardCollectionはシャードキーにインデックスを作成します。コレクションにすでにドキュメントが含まれている場合は、shardCollectionを使用する前に適切なインデックスを作成する必要があります。

バージョン2.2で変更:シャードキーのインデックスは、シャードキーと同一である必要はなくなりました。このインデックスは、以前のようにシャードキー自体のインデックスにすることも、シャードキーがインデックスのプレフィックスである複合インデックスにすることもできます。このインデックスをマルチキーインデックスにすることはできません。

フィールド{zipcode:1}を使用してシャーディングされたpeopleという名前のコレクションがあり、これをフィールド{zipcode:1、username:1}のインデックスに置き換えたい場合は、次のようにします。

{zipcode:1、username:1}にインデックスを作成します:db.people.ensureIndex({zipcode:1、username:1}); MongoDBがインデックスの作成を完了したら、既存のインデックスを{zipcode:1}に安全にドロップできます。db.people.dropIndex({zipcode:1}); 警告シャードキーのインデックスをマルチキーインデックスにすることはできません。上記のように、{zipcode:1、username:1}のインデックスは、usernameフィールドに配列値がない場合にのみzipcodeのインデックスを置き換えることができます。

シャードキーの最後の適切なインデックスを削除した場合は、シャードキーだけにインデックスを再作成して回復します。

シャードキーとインデックスについていくつか質問があります。

i)ドキュメントから、2.2より前にマルチキーインデックスがサポートされていたようです。その場合、複合インデックスはマルチキーインデックスとどのように異なりますか?

ii)[a]シャードキーで始まるインデックスと[b]プレフィックスとしてシャードキーを持つインデックスの違いは何ですか?

iii)シャードキーのインデックスがマルチキーインデックスであってはならないという警告事項は何ですか?db.people.ensureIndex({zipcode:1、username:1}はマルチキーインデックスではありませんか?

4

2 に答える 2

4

複合インデックスはマルチキーインデックスとどのように異なりますか?:

複合インデックスは、例で説明したようなインデックスです。

{ zipcode: 1, username: 1 }

tagsマルチキーインデックスは、タグ'mongoDB'を含むすべてのドキュメントを返すために使用されるインデックスのように、配列内のアイテムにインデックスを付けるインデックスです。

[a]シャードキーで始まるインデックスと[b]プレフィックスとしてシャードキーを持つインデックスの違いは何ですか?:

何もない。

シャードキーのインデックスがマルチキーインデックスであってはならないという警告事項は何ですか?:

マルチキーインデックスが配列上のインデックスであると考える場合、これはかなり理にかなっています。タグ配列のインデックスについて考えてみましょう。配列に適切な値のコレクションがあれば、ドキュメントは多くの(またはすべての)シャードに簡単に存在できます。

つまり、オブジェクトや配列ではなく、単一の値に基づいてドキュメントをシャーディングする必要があります。

于 2012-08-23T17:30:23.190 に答える
3

インデックスに関する MongoDB のドキュメントが混乱を招いている可能性があることに気付きました。マルチキー インデックスは、配列内の各要素に対して個別のインデックス エントリを作成する方法です: http://www.mongodb.org/display/DOCS/Multikeys。一方、複合インデックスは、2 つ以上のフィールドにインデックス エントリを作成します: http://www.mongodb.org/display/DOCS/Indexes#Indexes-CompoundKeys

  1. マルチキー シャード キー インデックスは、以前のバージョンの MongoDB ではサポートされていませんでした。MongoDB はシャード キー値の範囲に基づいてシャード コレクションを分割するため、マルチキー インデックスを使用することはできません。

  2. 私があなたの質問を理解していると仮定すると、違いはありません。シャード キー インデックスは、単一フィールドのインデックス、またはシャード キーで始まる複合インデックスにすることができます。

  3. これは、シャード キー インデックスに使用できる複合インデックスの例です。


zipcode がシャード キーの場合、次のインデックスが機能します。

db.people.ensureIndex({ zipcode: 1}) 

db.people.ensureIndex({ zipcode: 1, username: 1 }) 

マルチキー インデックスの例:

{_id: 1, array: [{zipcode: x}, {username: y}]}

db.people.ensureIndex({array: 1}) 
于 2012-08-20T21:41:29.597 に答える