在MongoDB中,我收集了不同年份的电影。
考虑这些文档:
{
"_id" : ObjectId("63a994974ac549c5ea982d2b"),
"title" : "Destroyer",
"year" : 1907
},
{
"_id" : ObjectId("63a994974ac549c5ea982d2a"),
"title" : "Aquaman",
"year" : 1902
},
{
"_id" : ObjectId("63a994974ac549c5ea982d29"),
"title" : "On the Basis of Sex",
"year" : 1907
},
{
"_id" : ObjectId("63a994974ac549c5ea982d28"),
"title" : "Holmes and Watson",
"year" : 1902
},
{
"_id" : ObjectId("63a994974ac549c5ea982d27"),
"title" : "Conundrum: Secrets Among Friends",
"year" : 1902
},
{
"_id" : ObjectId("63a994974ac549c5ea982d26"),
"title" : "Welcome to Marwen",
"year" : 1907
},
{
"_id" : ObjectId("63a994974ac549c5ea982d25"),
"title" : "Mary Poppins Returns",
"year" : 1997
},
{
"_id" : ObjectId("63a994974ac549c5ea982d24"),
"title" : "Bumblebee",
"year" : 2004
}
我想显示电影最少的年份,显示当年的电影数量。所以,在之前的文件中,你可以看到有2年的电影数量相同。年份:1907年和1902年。
因此,我想把这些年份合并到一个文档中。我试过这个代码:
var query1 = {$group: {"_id": "$year",
"movies": {$sum:1},
"Years": {$addToSet:"$year"},
}}
var stages = [query1]
db.movies.aggregate(stages)
但是,输出是这样的:
{
"_id" : 1907,
"movies" : 3,
"Years" : [ 1907 ]
},
{
"_id" : 1902,
"movies" : 3,
"Years" : [ 1902 ]
},
我不想那样。我想要的输出是这样的:
{
"_id" : 1902,
"movies" : 3,
"Years" : [ 1907, 1902 ]
}
一旦你得到这个,我想显示的最终输出是这样的:
{
"_id" : [1907, 1902],
"movies" : 3
}
我不知道该怎么做。我不能把这么多年的时间都放在一个数组里…
我怎样才能得到那个?我怎样才能得到之前的输出?
非常感谢您的关注。无论你需要什么,请说出来。
一个选择是按照@Joe的建议去做:
db.collection.aggregate([
{$group: {
_id: "$year",
count: {$sum: 1}
}},
{$group: {
_id: "$count",
years: {$push: "$_id"}
}},
{$sort: {_id: -1}},
{$limit: 1},
{$project: {_id: 0, count: "$_id", years: 1}}
])
看看它在操场的例子中是如何工作的
如果两个值相等,则在尝试连接后创建一个条件并更改数据类型,保存在相同的数组中或使用修剪到四个字母','并存储数据库,然后获取电影值和这个新的连接数组。我不确定,我只是给出我的想法
该组的_id为$year
,因此每年将有一个单独的文档。
你应该做的是两个分组阶段,第一个是_id: "$year"
,计算每年的电影数量,第二个是_id: $movies
, addToSet为分组年,电影数量相同