我需要在MongoDB中生成一个简单的频率表。假设我在名为books
的集合中有以下文档。
{
"_id": 1,
genre: [
"Fantasy",
"Crime",
"Drama"
]
}
{
"_id": 2,
genre: [
"Drama"
]
}
预期输出为: 幻想:1 犯罪:1 戏剧:2
假设我没有关于什么类型可能的预先形成的概念,我如何让MongoDB检测类型并计算它们?这似乎是聚合框架的工作。
到目前为止,我已经到了这个阶段:
db.books.aggregate([
{
$group: {
_id: null,
test: {$push: "$genre"}
}
}
])
这不能按预期工作,因为它只是添加每个文档的类型数组。谁能指出我正确的方向?我应该使用聚合框架吗?
谢谢!
答案 0 :(得分:6)
在聚合框架中处理数组时,通常需要使用$unwind
。这会处理数组,并为每个数组成员生成一个新文档。可以将其视为使用SQL JOIN进行“反规范化”。
一旦阵列“解开”,您就可以处理$group
:
db.collection.aggregate([
{ "$unwind": "$genre" },
{ "$group": {
"_id": "$genre",
"count": { "$sum": 1 }
}}
])
这给出了输出:
{ "_id" : "Drama", "count" : 2 }
{ "_id" : "Crime", "count" : 1 }
{ "_id" : "Fantasy", "count" : 1 }
提供给_id
的{{1}}是您想要分组的“密钥”,在您的情况下,这是“类型”,称为“值”,前缀为{{1 “$ genre”。 $sum
只会为每次出现添加1的值,通常是您的计算方式。
SQL to Aggregation mapping chart显示了几个示例,这不仅是那些习惯于SQL的有用指南,而且还有一般的实际使用示例。