2017-01-25 13 views
7

questionの回答によれば、オブジェクトのプロパティの順序は保証されません。では、複数のソートフィールドをオブジェクトとして渡すと、ソート関数はMongoDBでどのように完璧に機能しますか?mongodbのソートのプロパティの順序はどのように維持されますか?

db.users.find({}).sort({firstName: 1, age:-1}).exec(callback); 

mongodbはまずfirstNameでソートしてから年齢でソートする必要がありますか?間違った前提で作業していますか?

+2

もしあなたが明示的にmongodbに** firstNameでソートし、次に年齢によって** ** – ares

+0

Mongodbドライバの実装が実際にECMAScript標準と矛盾するように動作する必要があるからです。それは既にここで答えられました:http://stackoverflow.com/a/18514551/5309460 – Meni

+0

@Meniいいえそうする必要はありません。たとえば、公式のノードドライバは、複数のフィールドでソートする構文が異なります。 – str

答えて

6

これは興味深い質問です。

実際にほとんどのECMAScript実装として動作します。doは、ノードで使用されるV8などのキーオーダーを保持します。単一昇順で並べ替えの好みの配列

{ "sort": [['field1','asc'], ['field2','desc']] } 

をとるソートオプションパラメータでacievedすることができますソート

:しかし、公式Node MongoDB driverではなく、2つの異なる表記法を提供しています、その使用を奨励していません。フィールド配列はフィールド名で置き換えることができます。

{ "sort": "name" } 

マングースのドキュメントには、キーの順序(少なくともない私の知っていること)については何も言及していません。しかし、それはまたtwo different approaches to sortingを提供しています:

// sort by "field" ascending and "test" descending 
query.sort({ field: 'asc', test: -1 }); 

// equivalent 
query.sort('field -test'); 

確かにマングースのソート機能は間違った(ただし、現在有効な)仮定に基づいていたようです。複数のキーで並べ替えるときは、文字列表記を使用するのが最善の方法です。私はこれについてMongoose issueを作成しました。

MongoDBを純粋なJSONではなくextended JSONとして直接使用する場合(MongoDBシェルなど)、MongoDBを直接使用する場合、オブジェクト表記によるソートは適切に機能します。

また、この非常に関連する質問を参照してください。その間にHow can you specify the order of properties in a javascript object for a MongoDB index in node.js?


を、私はマングースのために作成された問題が閉じられました:

うん、それはマングースやMongoDBの両方のために不幸なジレンマですドライバ ECMAScriptでは、キーは注文されていないと言われていますが、 はV8で実際に注文されています(数字キー以外は の場合があります)。近い将来、 のV8で注文され続ける可能性があります。 に関心がある場合は、[['field1'、 'asc']]構文または マングース固有の 'field1 -field2'構文またはES2015 Mapクラス (キーの挿入順序を保証します)を使用できますキーオーダー。だから

マングースを用いて、いずれかの文字列表記または挿入順序によって順序付けされることが保証されES2015 Mapsための新しく追加されたサポートを使用します。

1

あなたの例では、MongoDBのソート操作にインデックスを使用し、複数のフィールドでソートする場合は、複数のフィールドのソートをサポートする複合インデックスを作成します。インデックスを作成したときと同じように、クエリプランナはインデックス(あなたの例の注文:名字、姓)から並べ替え順序を取得し、注文順に並べ替えます。もう1つの例では、javascriptオブジェクトです。 Javascriptはソートを保証しません。

関連する問題