集約フレームワークの$unwind 演算子を使用して、配列を複数のドキュメントに巻き戻すことができます。
db.fruits.aggregate(
{$unwind: "$sort"},
{$sort: {sort: 1}}
)
この$unwind
操作では、配列内の値ごとに 1 つずつ、複数のドキュメントを作成することにより、ドキュメントの配列を「巻き戻します」。次に、指定された基準で並べ替えます。したがって、入力については次のようになります。
> db.fruits.insert({sort:[1,2,4,6], fruit:'apple'})
> db.fruits.insert({sort:[3], fruit:'cherry'})
> db.fruits.insert({sort:[5], fruit:'orange'})
結果の出力が得られます。
> db.fruits.aggregate({$unwind: "$sort"}, {$sort: {sort: 1}})
{
"result" : [
{
"_id" : ObjectId("51f0592c8a542caf3f07fa66"),
"sort" : 1,
"fruit" : "apple"
},
{
"_id" : ObjectId("51f0592c8a542caf3f07fa66"),
"sort" : 2,
"fruit" : "apple"
},
{
"_id" : ObjectId("51f059358a542caf3f07fa67"),
"sort" : 3,
"fruit" : "cherry"
},
{
"_id" : ObjectId("51f0592c8a542caf3f07fa66"),
"sort" : 4,
"fruit" : "apple"
},
{
"_id" : ObjectId("51f0593b8a542caf3f07fa68"),
"sort" : 5,
"fruit" : "orange"
},
{
"_id" : ObjectId("51f0592c8a542caf3f07fa66"),
"sort" : 6,
"fruit" : "apple"
}
],
"ok" : 1
}
元の並べ替え配列を維持する必要がある場合は、次$project
のように並べ替えフィールドをフィールドにコピーする元のドキュメントの射影を作成するために使用できますexpanded_sort
。
db.fruits.aggregate(
{$project: {sort: 1, fruit: 1, expanded_sort: "$sort"}},
{$unwind: "$expanded_sort"},
{$sort: {expanded_sort: 1}}
)
これにより、次のような結果が得られます。
"result" : [
{
"_id" : ObjectId("51f0592c8a542caf3f07fa66"),
"sort" : [ 1, 2, 4, 6 ],
"fruit" : "apple",
"expanded_sort" : 1
},