MongoDB:当汇总中不存在匹配条件时,如何在$ facet中将$ count默认为0

问题描述

我正在处理一个复杂的分页聚合查询,我正在尝试查看Mongo是做什么和不能做什么。我遵循了这个问题here,除了没有返回数据时,所有其他方法都工作正常。

Mongo返回:{ Metadata: [],data: [] },但我想看看是否有可能返回

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

使前端更容易处理。到目前为止,我还无法实现这一目标。

这是我正在使用的 $ facet管道摘要

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

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

解决方法

您可以在最后检查条件,

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

Playground


$switch大小写运算符的其他选项,

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

Playground