【问题标题】:MongoDB: How to default $count to 0 in a $facet when there is no matching criteria in aggregateMongoDB:当聚合中没有匹配条件时,如何在 $facet 中将 $count 默认为 0
【发布时间】:2021-01-30 02:27:09
【问题描述】:

我正在处理一个复杂的分页聚合查询,我想看看 Mongo 能做什么,不能做什么。我关注了这个问题here,除了没有返回数据时,一切正常。

Mongo返回:{ metadata: [], data: [] },但我想看看是否可以返回

{ metadata: [ { count: 0 } ], data: [] }

让前端处理起来更容易。到目前为止,我还没有做到这一点。

这是我正在使用的 $facet 管道的 sn-p:

{
  "$facet": {
    "metadata": [{
      "$count": "total"
    }],
    "data": [{
      "$skip": 0
    }, {
      "$limit": 10
    }]
  }
}

当然这可以在后端查询后完成,但我真的希望 Mongo 处理它。

【问题讨论】:

    标签: node.js mongodb aggregation-framework


    【解决方案1】:

    你可以在最后检查条件,

    • $addFields 检查$cond 如果metadata 数组大小为零,则返回总计数为零的静态数组,否则返回原始元数据数组
      // <= skipping your pipelines
      {
        $addFields: {
          metadata: {
            $cond: [
              { $eq: ["$metadata", []] },
              [{ total: 0 }],
              "$metadata"
            ]
          }
        }
      }
    

    Playground


    $switch case 运算符的其他选项,

    • $switch 检查第一种情况,如果 metadata 等于 [] 然后返回总计为零并在 default 返回原始 metadata 数组
      {
        $addFields: {
          metadata: {
            $switch: {
              branches: [
                {
                  case: { $eq: ["$metadata", []] },
                  then: [{ total: 0 }]
                }
              ],
              default: "$metadata"
            }
          }
        }
      }
    

    Playground

    【讨论】:

    • 我添加到 Playground 以展示我的案例。通常这是一个数据不存在的日期范围,但我想展示如果没有任何数据显示它的外观。 mongoplayground.net/p/eJSodjH7zUG
    猜你喜欢
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    相关资源
    最近更新 更多