mongodb聚合框架-从函数生成_id

2024-03-25

是否可以在 $group 的 _id 字段中拥有自定义函数?尽管文档似乎表明可以计算该字段,但我无法使其工作。

例如,假设我有一组文档,其中的数字字段范围为 1 到 100。我想将数字分类到多个桶中,例如1-20、21-40 等。然后,我将使用此存储桶标识符对不同的字段求和/求平均值。所以我正在尝试这样做:

$group : { _id : bucket("$numberfield") , sum: { $sum: "$otherfield" } }

...其中bucket是一个返回字符串的函数,例如“1-20”。

那行不通。

http://docs.mongodb.org/manual/reference/operator/aggregation/group/#pipe._S_group http://docs.mongodb.org/manual/reference/operator/aggregation/group/#pipe._S_group

对于这个 _id 字段,您可以指定各种表达式,包括管道中文档中的单个字段、前一阶段的计算值、包含多个字段的文档以及其他有效表达式,例如常量或子文档字段。


与 MongoDB 2.4 一样,您无法在聚合框架中实现任何自定义函数。如果你想$group如果您不想每次都计算,则需要通过聚合运算符和表达式或通过显式 update() 添加这些字段。

使用聚合框架,您可以添加计算的bucket场在一个$project管道步骤与$cond操作员 http://docs.mongodb.org/manual/reference/operator/aggregation/cond/.

这是基于计算范围的示例numberField然后可以用于$groupsum/avg/等的管道:

db.data.aggregate(
    { $project: {
        numberfield: 1,
        someotherfield: 1,
        bucket: {
            $cond: [ {$and: [ {$gte: ["$numberfield", 1]}, {$lte: ["$numberfield", 20]} ] }, '1-20', {
            $cond: [ {$lt: ["$numberfield", 41]},  '21-40',  {
            $cond: [ {$lt: ["$numberfield", 61]},  '41-60',  {
            $cond: [ {$lt: ["$numberfield", 81]},  '61-80',  {
            $cond: [ {$lt: ["$numberfield", 101]}, '81-100', '100+' ]
            }]}]}]}]
        }
    }},
    { $group: {
        _id: "$bucket",
        sum: { $sum: "$someotherfield" }
    }}
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mongodb聚合框架-从函数生成_id 的相关文章

随机推荐