【问题标题】:aggregating multiple fields from documents in separate collections using MongoDB使用 MongoDB 从不同集合中的文档聚合多个字段
【发布时间】:2018-09-19 01:12:26
【问题描述】:

我使用下面的代码来显示不同集合的两个字段的结果:InfoMovie 和 Rate,将 MID 作为它们之间的公共字段。我想要一个使用 Mongodb 将集合“InfoMovie”中的“Actors”和集合“Rate”中的“remark”显示到一个 resltset 中的结果集。但是当我执行下面的代码时,它只显示“备注”列表,但不显示备注的演员名称。 [注:合集中所有演员均未备注。很少有人备注。我们只需要显示被评论的演员的名字。] 如果有人能解决这个问题,我将不胜感激。先感谢您! :)

db.InfoMovie.aggregate([
 {
    $lookup: 
    { 
        from:"Rate",
        localField:"MID", 
        foreignField:"MID", 
        as:"ActorsRating"
    }
},
    {
        $project:{"Remark":1,"Actors":1}
    }
])

以下是示例文档: 集合 infoMovie 的示例文档:

{
    "MID":"1",
    "MovieName":"Iron man",
    "Actors":"RDJ",
    "RDate":"2008",
    "Country":"USA",
}, 

{
    "MovieID":"2",
    "MovieName":"Dark Knight",
    "Actors":"Christian Bail",
    "RDate":"2007",
    "Country":"USA",
}

我使用的 mongod 版本是 3.4.7。谢谢!

采集率示例文档:

{
    "MID":1,
    "ReviewedBy":"John",
    "Rate":4,
    "Date":"10/04/2013",
    "remark":"The best Movie ever!",
},
{
    "MID":2,
    "ReviewedBy":"William",
    "Rate":8,
    "Date":"19/06/2014",
}     

【问题讨论】:

  • 项目阶段应该是这样的$project:{"Remark":"$ActorsRating","Actors":1}
  • 但它也给出了未注释电影的结果。我们怎么能不显示那些没有被标记的?还是谢谢。
  • 好的,你能把这两个集合中的示例文档发布并提到你的 mongodb 版本吗
  • 先生您好!我已经添加了文件的代码。你能通过它吗!
  • 我们可以借助集合“rate”中的属性“remark”来识别。集合“速率”由集合“InfoMovie”中的少数电影名称组成,并且备注列包含已备注和未备注的电影的 cmets。是否可以将 InfoMovie 中的演员姓名和 Rate 中的评论显示为结果集?感谢您的回复。

标签: mongodb mongodb-query aggregation-framework non-relational-database


【解决方案1】:

你可以试试下面的聚合

你需要使用$filter聚合过滤掉Remark等于undefined的文档。

db.InfoMovie.aggregate([
  { "$lookup": { 
    "from":"Rate",
    "localField":"MID", 
    "foreignField":"MID", 
    "as":"ActorsRating"
  }},
  { "$project": {
    "Actors": 1,
    "Remark": {
      "$filter": {
        "input": "$ActorsRating",
        "as": "ac",
        "cond": { "$ne": ["$$ac.remark", undefined] }
      }
    }
  }}
])

【讨论】:

  • @Rocky,出于性能原因,升级到 v3.6 或更高版本是个好主意,因为您可以利用“备注”字段上的索引并将 $match 阶段移动到$lookup 管道。
  • @dnickless 是的,但 OP 不在 3.6 上。
  • 是的,不用担心,这就是为什么我写了如果他能升级就好了。
  • 那么我认为你应该对问题发表评论:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 2017-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-29
相关资源
最近更新 更多