use*_*890 10 mongodb aggregation-framework
以下是MongoDB教程中的一个示例(此处为收集邮政编码db:
db.zipcodes.aggregate( [
{ $group: { _id: "$state", totalPop: { $sum: "$pop" } } },
{ $match: { totalPop: { $gte: 10*1000*1000 } } }
] )
Run Code Online (Sandbox Code Playgroud)
如果我_id
用其他类似的东西替换Test
,我会得到错误信息:
"errmsg" : "exception: the group aggregate field 'Test' must be defined as an expression inside an object",
"code" : 15951,
"ok" : 0
Run Code Online (Sandbox Code Playgroud)
有人能帮我理解为什么_id
我的命令需要吗?我认为MongoDB会自动分配ID,如果使用不提供ID.
该_id
字段是强制性的,但null
如果您不希望针对一个或多个键进行聚合,则可以将其设置为。不使用它会导致字段上的单个聚合值。因此,它在此上下文中充当“保留词”,指示每个组的结果“标识符”/键是什么。
在您的情况下,分组依据_id: "$state"
将导致 的n
汇总结果totalPop
,前提是(类似于)有n
不同的值。然而,state
SELECT SUM() FROM table GROUP BY state
$group : {_id : null, totalPop: { $sum: "$pop" }}}
Run Code Online (Sandbox Code Playgroud)
将为totalPop
(类似于SELECT SUM() FROM table
)提供单一结果。
这种行为在组操作员文档中有很好的描述。
在一个$group
阶段,_id
用于指定组条件.你显然需要它.
如果您熟悉SQL世界,请将其视为GROUP BY
子句.
请注意,在该上下文中,_id
实际上是生成的集合中的唯一标识符,因为根据定义$group
,不能生成具有该字段的相同值的两个文档.
我们将了解阶段_id
内的领域$group
并查看_id
在组聚合阶段构建s的一些最佳实践.我们来看看这个查询:
db.companies.aggregate([{
$match: {
founded_year: {
$gte: 2010
}
}
}, {
$group: {
_id: {
founded_year: "$founded_year"
},
companies: {
$push: "$name"
}
}
}, {
$sort: {
"_id.founded_year": 1
}
}]).pretty()
Run Code Online (Sandbox Code Playgroud)
我们可能不清楚的一件事是,为什么该_id
领域是以这种"文件"的方式构建的?我们也可以这样做:
db.companies.aggregate([{
$match: {
founded_year: {
$gte: 2010
}
}
}, {
$group: {
_id: "$founded_year",
companies: {
$push: "$name"
}
}
}, {
$sort: {
"_id": 1
}
}]).pretty()
Run Code Online (Sandbox Code Playgroud)
我们不是这样做的,因为在这些输出文档中 - 这个数字究竟意味着什么并不明确.所以,我们实际上不知道.在某些情况下,这意味着在解释这些文件时可能会有困惑.因此,另一种情况可能是将_id
文档分组为多个字段:
db.companies.aggregate([{
$match: {
founded_year: {
$gte: 2010
}
}
}, {
$group: {
_id: {
founded_year: "$founded_year",
category_code: "$category_code"
},
companies: {
$push: "$name"
}
}
}, {
$sort: {
"_id.founded_year": 1
}
}]).pretty()
Run Code Online (Sandbox Code Playgroud)
$push
只需将元素推送到生成数组即可.通常,可能需要将升级字段分组到较高级别:
db.companies.aggregate([{
$group: {
_id: {
ipo_year: "$ipo.pub_year"
},
companies: {
$push: "$name"
}
}
}, {
$sort: {
"_id.ipo_year": 1
}
}]).pretty()
Run Code Online (Sandbox Code Playgroud)
将表达式解析为文档作为_id
键是完美的.
db.companies.aggregate([{
$match: {
"relationships.person": {
$ne: null
}
}
}, {
$project: {
relationships: 1,
_id: 0
}
}, {
$unwind: "$relationships"
}, {
$group: {
_id: "$relationships.person",
count: {
$sum: 1
}
}
}, {
$sort: {
count: -1
}
}])
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9751 次 |
最近记录: |