我正在学习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"
}
我正试着按"年"来分组。和"genres",并计算所有的"标题"没有重复。
我尝试的代码是:
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
}
这是错误的,因为我在文档中只有两个不同的标题。
我该如何解决这个问题?我怎样才能在没有重复和输出的情况下获得标题?
非常感谢!无论你需要问什么,请尽管问……我真的卡住了,我想学会做这件事。
我正在尝试按"年份"进行分组。和"genres",并计算所有的"标题"没有重复。…这里是对所有文档和count值进行分组当我只有两个不同的标题时,我得到的是6。
在我看来,在执行最终计数之前,您需要按标题进行重复数据删除。假设不同的电影没有相同的标题,像这样的代码将执行重复数据删除:
db.collection.aggregate([
{
$group: {
_id: "$title",
year: {
$first: "$year"
},
genre: {
$first: "genre"
},
}
},
{
$group: {
"_id": {
"year": "$year",
"genre": "$genres",
},
"count": {
$sum: 1
}
}
}
])
这里的游乐场演示显示了预期的输出:
[
{
"_id": {
"genre": "Sports",
"year": 2008
},
"count": 2
}
]
或者,您可以为当前分组中的电影标题生成一个具有不同值的数组,然后计算其大小。同样,对上面的电影标题进行相同的假设,像这样:
db.collection.aggregate([
{
$group: {
"_id": {
"year": "$year",
"genre": "$genres",
},
"count": {
"$addToSet": "$title"
}
}
},
{
"$addFields": {
"count": {
$size: "$count"
}
}
}
])
Playground演示在这里(与前一个示例的输出相同)。