您可以使用distinct() 方法。以下查询可以得到我们预期的输出:
db.mycollection.distinct("quizzes.skill");
更多信息请查看https://docs.mongodb.com/manual/reference/method/db.collection.distinct/
编辑 I:也计算技能数量
db.collection.aggregate([
{
$unwind:"$quizzes"
},
{
$group:{
"_id":"$quizzes.skill",
"k":{
$first:"$quizzes.skill"
},
"v":{
$sum:1
}
}
},
{
$project:{
"_id":0
}
},
{
$group:{
"_id":null,
"data":{
$push:"$$ROOT"
}
}
},
{
$project:{
"data":{
$arrayToObject:"$data"
}
}
},
{
$replaceRoot:{
"newRoot":"$data"
}
}
]).pretty()
数据集:
{
"_id" : ObjectId("5d66ad357d0ab652c42315f7"),
"user" : "values",
"date" : "234-234-234-234",
"quizzes" : [
{
"skill" : "html",
"score" : "12"
},
{
"skill" : "css",
"score" : "10"
}
]
}
{
"_id" : ObjectId("5d66ad357d0ab652c42315f8"),
"user" : "values2",
"date" : "234-234-234-234",
"quizzes" : [
{
"skill" : "Java",
"score" : "12"
},
{
"skill" : "html",
"score" : "10"
}
]
}
输出:
{ "Java" : 1, "css" : 1, "html" : 2 }
说明:我们正在创建一个键值对 (k,v),其中“k”是技能,“v”是技能出现次数。将字段名称作为“k”和“v”的原因是因为$arrayToObject 只接受这些字段。稍后,将所有键和值合并以准备最终文档。