MongoDB无重复问题聚合

hkmswyz6  于 2022-12-29  发布在  Go
关注(0)|答案(1)|浏览(161)

我正在学习MongoDB NoSQL,我陷入了一个问题。
请考虑以下文档:

{
    "_id" : ObjectId("63aad45c008cdce77c2c3f9e"),
    "title" : "The Express",
    "year" : 2008,
    "cast" : "Dennis Quaid",
    "genres" : "Sports"
},

{
    "_id" : ObjectId("63aad45c008cdce77c2c3fa0"),
    "title" : "The Express",
    "year" : 2008,
    "cast" : "Rob Brown",
    "genres" : "Sports"
},

{
    "_id" : ObjectId("63aad45c008cdce77c2c3fa2"),
    "title" : "The Express",
    "year" : 2008,
    "cast" : "Omar Benson Miller",
    "genres" : "Sports"
},

{
    "_id" : ObjectId("63aad45c008cdce77c2c416e"),
    "title" : "Semi-Pro",
    "year" : 2008,
    "cast" : "Will Ferrell",
    "genres" : "Sports"
},

{
    "_id" : ObjectId("63aad45c008cdce77c2c4170"),
    "title" : "Semi-Pro",
    "year" : 2008,
    "cast" : "Woody Harrelson",
    "genres" : "Sports"
},

{
    "_id" : ObjectId("63aad45c008cdce77c2c4172"),
    "title" : "Semi-Pro",
    "year" : 2008,
    "cast" : "André Benjamin",
    "genres" : "Sports"
}

我试着按“年份”和“流派”分组,并不重复地统计所有的“标题”。
我尝试的代码是这样的:

var query1 = {$group: {"_id": { "year": "$year", "genre": "$genres"}, "count": {$sum:1}}}

var stages = [query1]

db.genres.aggregate(stages)

但这是对所有文档的分组,当我只有两个不同的标题时,我得到的“count”的值是6。
我不知道怎样才能获得不重复的头衔。
预期输出如下所示:

{
    "_id":{
          "year": 2008
          "genre": "Sports"
    },
    "count": 2  
}

但是,对于我尝试的代码,输出如下所示:

{
    "_id":{
          "year": 2008
          "genre": "Sports"
    },
    "count": 6 
}

这是错误的,因为我在文档中只有两个不同的标题。
我如何解决这个问题?我如何得到没有重复的标题和这个输出?
非常感谢!无论你需要问什么,请你去问吧...我真的被卡住了,我想学着去做。

s3fp2yjn

s3fp2yjn1#

我试图按“年份”和“流派”分组,并不重复地计数所有“标题”。...但这是对所有文档进行分组,当我只有两个不同的标题时,我得到的“计数”值是6。
在我看来,在执行最终计数之前,您需要按片名删除重复项。假设不同的电影不会有相同的片名,则可以执行类似以下的删除重复项操作:

db.collection.aggregate([
  {
    $group: {
      _id: "$title",
      year: {
        $first: "$year"
      },
      genre: {
        $first: "genre"
      },
      
    }
  },
  {
    $group: {
      "_id": {
        "year": "$year",
        "genre": "$genres",
        
      },
      "count": {
        $sum: 1
      }
    }
  }
])

playground demonstration here显示输出符合预期:

[
  {
    "_id": {
      "genre": "Sports",
      "year": 2008
    },
    "count": 2
  }
]

或者,你可以为当前分组中的电影标题生成一个具有不同值的数组,然后计算它的大小。再次使用上面关于电影标题的相同假设,如下所示:

db.collection.aggregate([
  {
    $group: {
      "_id": {
        "year": "$year",
        "genre": "$genres",
        
      },
      "count": {
        "$addToSet": "$title"
      }
    }
  },
  {
    "$addFields": {
      "count": {
        $size: "$count"
      }
    }
  }
])

Playground demonstration here(具有与上一示例相同的输出)。

相关问题