我想检索的演员谁出现在一个最低的5电影使用两个不同的查询列表。在第一个查询中,没有使用$unwind,但是在$group stage中,它匹配每个参与者的详细信息。这个查询的目的是收集和计算actors,而不分解actors数组。
在第二个查询中,使用$unwind将表分解为单独的对象,从而允许我们分析单个参与者。虽然最终目标是获得至少参与过5部电影的演员列表(对象表),但$unwind的使用使第二个查询略有不同。
首次申请
db.films.aggregate([
{
$unwind:'$actors'
},
{
$group: {
_id: {
prenom:'$actors.first_name',
nom:'$actors.last_name'
},
nbr_films: {
$sum: 1
}
}
},
{
$match: {
nbr_films:{$gte:5}
}
},
{
$project: {
_id:0,
nom:"$_id.nom",
nbr_films:1
}
}
]);
返回:
[
{
"nbr_films": 6,
"nom": "Willis"
},
{
"nbr_films": 5,
"nom": "Oldman"
},
{
"nbr_films": 6,
"nom": "De Niro"
},
{
"nbr_films": 5,
"nom": "Caine"
},
{
"nbr_films": 6,
"nom": "Freeman"
}
]
第二次请求:
$group: {
_id: {
prenom:'$actors.first_name',
nom:'$actors.last_name'
},
nbr_films: {
$sum: 1
}
}
},
{
$match: {
nbr_films:{$gte:5}
}
},
{
$project: {
_id:0,
nom:"$_id.nom",
nbr_films:1
}
}
]); ```
**Returns:
**```
[
{
"nbr_films": 5
}
]
1条答案
按热度按时间wko9yo5t1#
首先,我假设'actors'是一个数组,因为第一个查询使用了'$unwind'。
从查询的其余部分来看,actors数组似乎包含一个像
{first_name:"Bruce",last_name:"Willis"}
这样的文档数组。如果不展开,
$actors.first_name
将解析为一个数组,其中包含“actors”数组中 every 对象的所有first_name
值。例如,如果文档看起来像:
然后
"$actors.first_name"
将解析为["Bruce", "Gary", "Robert", "Michael", "Morgan"]
Example当使用$unwind时,将从每个输入文档创建一组新文档,每个文档包含数组中的单个元素。Example
在第一个查询中,actors数组在一开始就展开了,因此$group's_id包含单个演员的名字和姓氏,而count则是使用该演员的电影数量。
在第二个查询中,actors没有被解开,所以$group's_id包含一个first_names数组和一个last_names数组,用于表示该电影中的所有演员。计数将是使用相同演员的电影数量,并且其名称在
actors
数组中以相同顺序出现。