2012-01-31 7 views
4

MongoDBでは、a field can have multiple values(値の配列)です。それぞれのインデックスはインデックスに登録されているため、任意の値をフィルタリングできます。しかし、複数の値を持つフィールドを「順序付け」することもできますし、結果は何ですか?MongoDBマルチキーはどのようにソートされますか?

アップデート:不等長の配列で

> db.test.find().sort({a:1}) 
{ "_id" : ObjectId("4f27e36b5eaa9ebfda3c1c53"), "a" : [ 0 ] } 
{ "_id" : ObjectId("4f27e3845eaa9ebfda3c1c54"), "a" : [ 0, 1 ] } 
{ "_id" : ObjectId("4f27df6e5eaa9ebfda3c1c4c"), "a" : [ 1, 1, 1 ] } 
{ "_id" : ObjectId("4f27df735eaa9ebfda3c1c4d"), "a" : [ 1, 1, 2 ] } 
{ "_id" : ObjectId("4f27df795eaa9ebfda3c1c4e"), "a" : [ 2, 1, 2 ] } 
{ "_id" : ObjectId("4f27df7f5eaa9ebfda3c1c4f"), "a" : [ 2, 2, 1 ] } 
{ "_id" : ObjectId("4f27df845eaa9ebfda3c1c50"), "a" : [ 2, 1 ] } 
{ "_id" : ObjectId("4f27e39a5eaa9ebfda3c1c55"), "a" : [ 2 ] } 

は長い配列は、短い配列

だから、より "下" である、なぜ[0]の前に[0,1です]、[2,1]の後は[2]ですか? 最初の配列要素に対してのみソートが行われていますか?または最低のもの?その後、それは挿入命令ですか?

インデックススキャンの場合(テーブルスキャンとは対照的に)、これはどのように実装されますか?

答えて

7

配列要素のソートはかなり複雑です。配列要素は配列フィールド上で別々にソートされるので、実際にはいくつかの面白い状況が発生します。 MongoDBは、ソート方向に応じて、配列内の最小値または最大値に基づいてMongoDBをソートします。それを超えて、注文は自然です。

これは、のようなものになる:つまり

> db.test.save({a:[1]}) 
> db.test.save({a:[0,2]}) 
> db.test.find().sort({a:1}) 
{ "_id" : ObjectId("4f29026f5b6b8b5fa49df1c3"), "a" : [ 0, 2 ] } 
{ "_id" : ObjectId("4f2902695b6b8b5fa49df1c2"), "a" : [ 1 ] } 
> db.test.find().sort({a:-1}) 
{ "_id" : ObjectId("4f29026f5b6b8b5fa49df1c3"), "a" : [ 0, 2 ] } 
{ "_id" : ObjectId("4f2902695b6b8b5fa49df1c2"), "a" : [ 1 ] } 

。逆ソートの場合も同じです。これは、一番上の文書の "a"フィールドが最低値と最高値の両方を保持しているためです。

MongoDBは、配列内の最高値({field:-1}ソート)または最低値({field:1}ソート)でない値をすべて無視し、残りの値を並べ替えます。あなたからのスキャンを見ることができるように

"a" value 0 -> document 4f29026f5b6b8b5fa49df1c3 
"a" value 1 -> document 4f2902695b6b8b5fa49df1c2 
"a" value 2 -> document 4f29026f5b6b8b5fa49df1c3 

:{:1}サンプルのドキュメント上に与えられた

は、インデックスのためにBツリーを平坦化(単純化)をペイントする

が、それはこのようなものを作品絵上から下、上から下の順で同じ順序になります。

空の配列は可能な限り「最小の」配列値であるため、上記のクエリの上部と下部にそれぞれ表示されます。

インデックスは、配列のソート動作を変更しません。

+0

インデックスが使用されている場合でもそれはそうですか? – Thilo

+0

これは、インデックスがクエリの結果を変更しないインスタンスの1つです。残念ながら、これはMongoDBでは常にそうではありません(これは率直に言ってバグだと私は考えています)。 –

+0

ただチェックしました。インデックスを作成しても、並べ替え順は変わりません(どちらが良いですか)。これがどのように実装されているのだろうか。 – Thilo

関連する問題