如何加入两个MongoDB集合+;团体?

如何加入两个MongoDB集合+;团体?,mongodb,mongodb-query,Mongodb,Mongodb Query,我是MongoDB新手,对查询有问题: 我有两个收藏: 集合:“输出2”:带有“电影ID”、“客户ID”、“评级”、“日期” 收藏:“电影名称”:带有“电影ID”、“年份”、“标题” 我必须找到电影“恐龙星球”每年和每月的平均评级,按asc顺序按年和月排序 结果应该如下所示: { "_id" : NumberInt(515436), "year" : NumberInt(2001), "month" : NumberInt(10), "Average" : 3

我是MongoDB新手,对查询有问题:

我有两个收藏:

  • 集合:“输出2”:带有“电影ID”、“客户ID”、“评级”、“日期”
  • 收藏:“电影名称”:带有“电影ID”、“年份”、“标题”
  • 我必须找到电影“恐龙星球”每年和每月的平均评级,按asc顺序按年和月排序

    结果应该如下所示:

    { 
        "_id" : NumberInt(515436), 
        "year" : NumberInt(2001),
        "month" : NumberInt(10),
        "Average" : 3.0, 
        "Movietitle": "Dinosaur Planet"
    }
    
    我试图用不同的方法解决它,但没有结果

    db.getCollection("output2").aggregate([ 
        {
       "$lookup":
         {
           from: "movie_titles",
           localField: "movieid",
           foreignField: "movieid",
           as: "movietitle"
         }
    },
    
        {
            "$group": { 
                "_id": {$year: '$date'}, 
                "Average": { "$avg": "$rating" }
            }
        },
        {
            "$match": {      
                "title": "Dinosaur Planet"
            }
        }
    ]);
    

    像这样的查询。所以我的问题是,我是否走在正确的道路上,或者是否有人有解决这个问题的好主意?

    您应该在
    $lookup
    之后使用
    $match
    ,查询和匹配字段将是
    电影字幕。title
    而不是
    title

    db.getCollection("output2").aggregate([ 
    {
    "$lookup":
     {
       from: "movie_titles",
       localField: "movieid",
       foreignField: "movieid",
       as: "movietitle"
     }
    },
    {
        "$match": {      
            "movietitle.title": "Dinosaur Planet"
        }
    },
    {
      "$unwind": "$movietitle"  
    },
    {
    "$group": { 
        "_id": {year: '$$ROOT.movietitle.year'}, 
          "Average": { "$avg": "$rating" }
        }
    }
    ]);
    

    您应该在
    $lookup
    查询之后使用
    $match
    ,匹配字段将是
    movietitle.title
    ,而不是
    title

    db.getCollection("output2").aggregate([ 
    {
    "$lookup":
     {
       from: "movie_titles",
       localField: "movieid",
       foreignField: "movieid",
       as: "movietitle"
     }
    },
    {
        "$match": {      
            "movietitle.title": "Dinosaur Planet"
        }
    },
    {
      "$unwind": "$movietitle"  
    },
    {
    "$group": { 
        "_id": {year: '$$ROOT.movietitle.year'}, 
          "Average": { "$avg": "$rating" }
        }
    }
    ]);
    

    所以,我不是坐在你的电脑前,除了你,这里的其他人也不是。也许您可以考虑向我们展示集合中的文档实际上是什么样子,以及加入您展示和分组的文档的预期结果实际上应该是在您的脑海中。显示聚合语句很好,但它缺少“上下文”,而没有向其他人显示一些数据供他们使用。为了重现您的预期结果,只需几份文档就足够了。请不要截图。谢谢,我编辑过了。希望问题现在好一点。这些文件应该如何相互关联?当我说“可复制”时,我的意思是我们应该能够使用你们提供给我们的数据,并返回你们期望看到的东西。因此,如果一个文档中的
    movieId
    等于
    1
    ,那么相关文档也需要共享相同的值。另一个集合和
    $lookup
    条件也是如此。你指的是很多,而不是一个,然后包括那个集合中的几个文件。这就是你在这里问这样一个问题的方式。所以,我不是坐在你的电脑前,除了你,这里的其他人也不是。也许您可以考虑向我们展示集合中的文档实际上是什么样子,以及加入您展示和分组的文档的预期结果实际上应该是在您的脑海中。显示聚合语句很好,但它缺少“上下文”,而没有向其他人显示一些数据供他们使用。为了重现您的预期结果,只需几份文档就足够了。请不要截图。谢谢,我编辑过了。希望问题现在好一点。这些文件应该如何相互关联?当我说“可复制”时,我的意思是我们应该能够使用你们提供给我们的数据,并返回你们期望看到的东西。因此,如果一个文档中的
    movieId
    等于
    1
    ,那么相关文档也需要共享相同的值。另一个集合和
    $lookup
    条件也是如此。你指的是很多,而不是一个,然后包括那个集合中的几个文件。你就是这样问这样的问题的。
    db.getCollection("output2").aggregate([ 
    {
    "$lookup":
     {
       from: "movie_titles",
       localField: "movieid",
       foreignField: "movieid",
       as: "movietitle"
     }
    },
    {
        "$match": {      
            "movietitle.title": "Dinosaur Planet"
        }
    },
    {
      "$unwind": "$movietitle"  
    },
    {
    "$group": { 
        "_id": {year: '$$ROOT.movietitle.year'}, 
          "Average": { "$avg": "$rating" }
        }
    }
    ]);