2

サブドキュメントの値に従って検索し、関連性でソートする必要のあるドキュメントがあります。

このトピックを調査しているときに、私はこの質問に出くわしました。アグリゲーションフレームワークを使用する必要があることはわかっていますが、ソリューションはサブドキュメントをカバーしていませんでした。

たとえば、teams.name ['blue'、'red'、'green']のサブドキュメントがあり、最も一致するものに基づいて並べ替えられたすべてのドキュメントを取得したいとします。

League Collection:
{ 
  coach: Henderson,
  teams:
  [ 
    {
       name: red,
       logo: bird,
       division: east
    },
    {
       name: blue,
       logo: bluejay,
       division: west
    },
   {
       name: green,
       logo: monkey,
       division: east
    }
 ]
}

{ 
  coach: Wilkins,
  teams:
  [ 
    {
       name: red,
       logo: bird,
       division: east
    },
    {
       name: blue,
       logo: bluejay,
       division: west
    },
 ]
}

{ 
  coach: Sandy,
  teams:
  [ 
    {
       name: red,
       logo: bird,
       division: east
    }
 ]
}

最終結果は次のようになります。

item          total matches
--------      --------------
Henderson     3
Wilkins       2
Sandy         1

どうすればこれを達成できますか?

4

1 に答える 1

3

次のことを試すことができます。

db.league.aggregate(
  {$match:{'teams.name':{$in:['red','blue','green']}}},
  {$unwind:'$teams'},
  {$match:{'teams.name':{$in:['red','blue','green']}}},
  {$project:{'item':'$coach','teams':1}},
  {$group:{_id:'$item',total:{$sum:1}}},
  {$sort:{total:-1}}
)

最初の一致は、赤、青、緑の少なくとも1つに一致するチームサブドキュメントを持つすべてのドキュメントに一致します。2回目の一致では、最初の一致に含まれていた偽のサブドキュメントが削除されます。

于 2013-03-25T06:34:57.323 に答える