我有一本书的清单。我想获得作者撰写的体裁数目,也想在结果中加上这些体裁。我的数据库如下:
{"_id": ObjectID("1), "title": "Harry Potter", "year": NumberInt(2000), "author": "JK. Rowling",
"genres": "Fantasy"},
"_id": ObjectID("2"), "title": "Harry Potter 99", "year": NumberInt(2020), "author": "JK. Rowling",
"genres": "Drama"}, "_id": ObjectID("2"), "title": "Harry Potter", "year": NumberInt(2000), "author": "JK. Rowling",
"genres": "Drama"}, {...}
所以,到目前为止,我的代码如下:
phase1 = {$group : {"_id" : "$author"}, "countgenres" : {$sum : 1}}
phase2 = {$addFields : "genres"}}
phase3 = {$sort : {"numgenres" : -1}}
steps = [phase1, phase2, phase3]
db.database.aggregate(steps)
这对我不起作用,所以我想请问有人可以帮助我编写正确的代码来做到这一点。结果应如下所示:
{
"_id" : "JK. Rowling",
"countgenres" : 4,
"genres" : [
"Fantasy",
"Drama"
]
}
一个小时前,我也发布了类似的问题,但是我在数据库中犯了一个错误,感谢您的宝贵时间。
答案 0 :(得分:1)
尝试在this查询中添加了新作者以检查排序。
db.collection.aggregate([
{
"$match": {
"author": "JK. Rowling"
}
},
{
"$unwind": "$genres"
},
{
"$group": {
"_id": "$author",
"genres": {
"$addToSet": "$genres"
}
}
},
{
"$project": {
"numgenres": {
"$size": "$genres"
},
"genres": 1
}
},
{
"$sort": {
"numgenres": -1
}
}
])
查询首先进行$unwind
,以将值与genres
分开,并使用$addToSet
来避免重复值。然后使用$project
获取数组大小。