一般的に、ソート順を指定せずに検索している場合、結果の順序は保証されません。
さらに、配列で並べ替えることはできません(説明されているように、配列を配列で並べ替える場合はさらに少なくなります)。 sort() 論理比較を使用して、結果ドキュメント内のフィールドに基づいて昇順または降順を決定します。
必要なカスタムソートロジックを独自のアプリケーションコードに実装する必要があります。
便利なアプローチは、新しい AggregationFramework を利用することです。 MongoDB 2.2では、特に、 $unwind 機能 ドキュメントのストリームへの配列。
たとえば、テストデータを次のように設定します。
{ "_id" : ObjectId("504ac93fb50571321b2f932a"), "a" : [ 1, 2, 4 ] }
{ "_id" : ObjectId("504ac946b50571321b2f932b"), "a" : [ 5, 4, 9 ] }
{ "_id" : ObjectId("504ac94eb50571321b2f932c"), "a" : [ 2, 1, 3 ] }
{ "_id" : ObjectId("504ac954b50571321b2f932d"), "a" : [ 7, 3, 9 ] }
$in
[2,3]で検索すると、一致するドキュメントが見つかります:
> db.matches.find({'a': { $in: [2,3]}})
{ "_id" : ObjectId("504ac93fb50571321b2f932a"), "a" : [ 1, 2, 4 ] }
{ "_id" : ObjectId("504ac94eb50571321b2f932c"), "a" : [ 2, 1, 3 ] }
{ "_id" : ObjectId("504ac954b50571321b2f932d"), "a" : [ 7, 3, 9 ] }
集約フレームワークを使用すると、$match
同じドキュメントを作成し、結果を操作して基本的な並べ替えを実行します:$unwind
配列、$sort
それら、そして$group
これらを結果に戻します:
db.matches.aggregate(
{ $match : {
a: { $in: [2,3] }
}},
{ $unwind : "$a" },
{ $sort: {
"a": -1
}},
{ $group : {
_id: '$_id',
a: { $addToSet: "$a" }
}}
)
したがって、この例では、配列が一致するドキュメントは、配列値の昇順で並べ替えられています。
{
"result" : [
{
"_id" : ObjectId("504ac94eb50571321b2f932c"),
"a" : [ 1, 2, 3]
},
{
"_id" : ObjectId("504ac93fb50571321b2f932a"),
"a" : [ 1, 2, 4 ]
},
{
"_id" : ObjectId("504ac954b50571321b2f932d"),
"a" : [ 3, 7, 9 ]
}
],
"ok" : 1
}