MongoDB通过匹配子文档按相关性排序

时间:2013-03-25 06:08:50

标签: mongodb aggregation-framework nosql

我有一个文档,必须根据其子文档中的值进行搜索,并按相关性排序。

在研究这个主题时,我遇到了这个question。我现在知道我必须使用聚合框架,但解决方案不包括子文档。

出于示例目的,我想抓住具有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

我将如何实现这一目标?

1 个答案:

答案 0 :(得分: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}}
)

第一场比赛将匹配所有文档,其中团队子文档至少匹配红色,蓝色和绿色之一。第二场比赛将删除第一场比赛中包含的虚假子文档。