mongodb 为什么我没有得到相同的结果,这两个不同的查询获取演员谁出现在至少5部电影

mzsu5hc0  于 2023-10-16  发布在  Go
关注(0)|答案(1)|浏览(85)

我想检索的演员谁出现在一个最低的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
}
]
wko9yo5t

wko9yo5t1#

首先,我假设'actors'是一个数组,因为第一个查询使用了'$unwind'。
从查询的其余部分来看,actors数组似乎包含一个像{first_name:"Bruce",last_name:"Willis"}这样的文档数组。
如果不展开,$actors.first_name将解析为一个数组,其中包含“actors”数组中 every 对象的所有first_name值。
例如,如果文档看起来像:

{ "actors": [
  { "first_name": "Bruce", "last_name": "Willis" },
  { "first_name": "Gary", "last_name": "Oldman" },
  { "first_name": "Robert", "last_name": "De Niro" },
  { "first_name": "Michael", "last_name": "Caine" },
  { "first_name": "Morgan", "last_name": "Freeman" }
]}

然后"$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数组中以相同顺序出现。

相关问题