首页 文章

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

提问于
浏览
0

是否可以在$ 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

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

1 回答

  • 0

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

    使用聚合框架,您可以使用$cond operator$project 管道步骤中添加计算的 bucket 字段 .

    以下是基于 numberField 计算范围的示例,然后可以在 $group 管道中使用sum / avg / etc:

    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" }
        }}
    )
    

相关问题