Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB通过匹配子文档按相关性排序_Mongodb_Aggregation Framework_Nosql - Fatal编程技术网

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

MongoDB通过匹配子文档按相关性排序,mongodb,aggregation-framework,nosql,Mongodb,Aggregation Framework,Nosql,我有一个文档,必须根据其子文档中的值进行搜索,并按相关性排序 在研究这个话题时,我遇到了这个问题。我现在知道我必须使用聚合框架,但解决方案没有涵盖子文档 例如,我想抓取每个有teams.name子文档的文档['blue'、'red'、'green'],并根据它拥有的最匹配项进行排序 League Collection: { coach: Henderson, teams: [ { name: red, logo: bird, di

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

在研究这个话题时,我遇到了这个问题。我现在知道我必须使用聚合框架,但解决方案没有涵盖子文档

例如,我想抓取每个有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

如何实现这一点?

您可以尝试以下方法:

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}}
)
第一个匹配将匹配团队子文档至少匹配红色、蓝色和绿色之一的所有文档。第二个匹配将删除第一个匹配中包含的虚假子文档