1

これらのドキュメントを含むコレクションがあるとします。

{sort:[1,2,4,6], fruit:'apple'}
{sort:[3], fruit:'cherry'}
{sort:[5], fruit:'orange'}

そして、次のようなクエリを実行したいと思います。

 db.collection.find().sort({sort: -1})

ただし、次のように最初に重複排除せずにドキュメントを返すようにします。

{sort:[1,2,4,6], fruit:'apple'}
{sort:[1,2,4,6], fruit:'apple'}
{sort:[3], fruit:'cherry'}
{sort:[1,2,4,6], fruit:'apple'}
{sort:[5], fruit:'orange'}
{sort:[1,2,4,6], fruit:'apple'}

これの代わりに:

{sort:[1,2,4,6], fruit:'apple'}
{sort:[3], fruit:'cherry'}
{sort:[5], fruit:'orange'}

現在の MongoDB でこれを達成する方法はありますか?

4

1 に答える 1

2

集約フレームワークの$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
  },
于 2013-07-24T22:48:49.437 に答える