4

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]は[2,1]の後にあるのでしょうか。ソートは最初の配列要素でのみ行われるのでしょうか?または最低のもの?そしてその後は挿入順ですか?

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

4

1 に答える 1

7

配列要素の並べ替えはかなり複雑です。配列要素には個別にインデックスが付けられているため、配列フィールドで並べ替えると、実際にはいくつかの興味深い状況が発生します。何が起こるかというと、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:1}のフラット化されたbツリー:

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

ご覧のとおり、上から下、下から上へのスキャンは同じ順序になります。

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

インデックスは、配列の並べ替えの動作を変更しません。

于 2012-01-31T09:11:49.647 に答える