【问题标题】:MongoDB conditional (sum if exists, else zero)MongoDB 条件(如果存在则求和,否则为零)
【发布时间】:2021-07-20 21:39:03
【问题描述】:

我正在尝试对可能不存在该字段的聚合管道中的字段求和。否则,回报应该为零。到目前为止,这是我的代码:

admits = [
    {'$match': {'meta.State': item['state'],'meta.County': item['county'], 'meta.first_seen': date}},
    {'$group': {'_id': {'item': '$item'}, 'admissions': {'$ifNull': [{'$sum': 1}, 0]}}},
]

这不起作用,因为在 $ifNull 内调用 $sum 会引发一元运算符异常:

pymongo.errors.OperationFailure: The $ifNull accumulator is a unary operator

【问题讨论】:

    标签: python mongodb aggregate pymongo ifnull


    【解决方案1】:

    pymongo.errors.OperationFailure:$ifNull 累加器是一元运算符

    <accumulator> 运算符必须是以下累加器运算符之一:accumulator-operator,而$ifNull 运算符不是其中之一,

    如果要求和,$sum 运算符必须在根目录中,

    $ifNull的用法是:

    计算表达式并在表达式计算结果为非空值时返回表达式的值。如果表达式的计算结果为空值,包括未定义值或缺失字段的实例,则返回替换表达式的值。

    所以$ifNull 无法满足您的要求,

    您可以尝试$cond 运算符来检查字段类型是否缺失然后为0,否则为1,

    {
      '$group': {
        '_id': {'item': '$item'}, 
        'admissions': {
          $sum: {
            $cond: [{ $eq: [{ $type: "$admissions" }, "missing"] }, 0, 1]
          }
        }
      }
    },
    

    【讨论】:

    • 我不确定这会在输出中实现 0... [{'_id': {'item': None}, 'admissions': 3}] [{'_id': {' item':无},'admissions':4}] [] [{'_id':{'item':无},'admissions':7}] [{'_id':{'item':无}, 'admissions': 5}]
    • 本文中的示例文档:stackoverflow.com/questions/67271918/…
    • 对于给定的日期 t,可能没有带有 meta.first_seen: t 的文档
    • 这可能不是最干净的解决方法,但我可以尝试在聚合返回时除外,如果它是空列表则插入 0...
    • 你能显示更新的帖子吗?如果没有解决,请在playground 中添加一些文档并分享链接。
    猜你喜欢
    • 1970-01-01
    • 2018-10-12
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 2019-03-10
    相关资源
    最近更新 更多