Dio*_*Dan 1 mongodb mongodb-query aggregation-framework
我需要在MongoDB中生成一个简单的频率表.假设我在一个名为的集合中有以下文档books
.
{
"_id": 1,
genre: [
"Fantasy",
"Crime",
"Drama"
]
}
{
"_id": 2,
genre: [
"Drama"
]
}
Run Code Online (Sandbox Code Playgroud)
预期输出为:幻想:1犯罪:1戏剧:2
假设我没有关于什么类型可能的预先形成的概念,我如何让MongoDB检测类型并计算它们?这似乎是聚合框架的工作.
到目前为止,我已经到了这个阶段:
db.books.aggregate([
{
$group: {
_id: null,
test: {$push: "$genre"}
}
}
])
Run Code Online (Sandbox Code Playgroud)
这不能按预期工作,因为它只是添加每个文档的类型数组.谁能指出我正确的方向?我应该使用聚合框架吗?
谢谢!
在聚合框架中处理数组时,通常需要使用的是$unwind
.这会处理数组,并为每个数组成员生成一个新文档.可以将其视为使用SQL JOIN进行"反规范化".
一旦阵列"解开",你就可以处理你的$group
:
db.collection.aggregate([
{ "$unwind": "$genre" },
{ "$group": {
"_id": "$genre",
"count": { "$sum": 1 }
}}
])
Run Code Online (Sandbox Code Playgroud)
这给出了如下输出:
{ "_id" : "Drama", "count" : 2 }
{ "_id" : "Crime", "count" : 1 }
{ "_id" : "Fantasy", "count" : 1 }
Run Code Online (Sandbox Code Playgroud)
该_id
提供$group
的是"关键"要组上,你的情况,这是"流派"被称为它的"价值"通过与前缀$
"$流派".在$sum
简单地加起来的1值在每种情况下,通常是你怎么算.
SQL to Aggregation映射图中显示了几个示例,它不仅是那些习惯于SQL的有用指南,而且还有一般的实际使用示例.