mongodb 如何在聚合中返回计数:0(如果不匹配)

7qhs6swi  于 2023-02-08  发布在  Go
关注(0)|答案(1)|浏览(286)

我有一个问题,我认为它会经常发生,但我无法找到足够的信息在我的研究。
我的问题是,我期望查询的返回具有给定的JSON格式,但是当匹配过滤掉所有文档时,我没有得到json。
一个简单的例子:我希望统计与给定条件匹配的文档,因此我有以下查询

db.collection.aggregate( [{ 
       $match: {
            type: /^1[.]2[.]3[.].*$/
        }
    }, {
        $group: {
            _id: {$ifNull : ["$type", 0]}, 
            count: { $sum: 1 }
        }
    }]);

如果至少有一个文档匹配,则查询有效:

{ "_id" : "1.2.3", "count" : 44 }

如果我没有文档,我希望收到这样的json:

{ "_id" : "1.5.3", "count" : 0 }

这可能吗?
ps:这是一个简化的情况,在应用程序端处理它并不容易,所以我宁愿尝试调整我的查询

bjp0bcyl

bjp0bcyl1#

如果您事先知道要搜索的键的值(例如1.2.3,在您的情况下为1.5.3),下面是使用$facet的一个变通方法。它首先尝试通过$match获取文档,并将它们存储到名为results的数组中。我们用$group结果替换它(当我们有匹配的记录时);或将其替换为默认计数:0记录与您指定的键。

db.collection.aggregate([
  {
    "$facet": {
      "results": [
        {
          $match: {
            "type": <key you want to search>
          }
        },
        {
          $group: {
            _id: {
              $ifNull: [
                "$type",
                0
              ]
            },
            count: {
              $sum: 1
            }
          }
        }
      ]
    }
  },
  {
    "$replaceRoot": {
      "newRoot": {
        "$cond": {
          "if": {
            $gt: [
              {
                "$size": "$results"
              },
              0
            ]
          },
          "then": "$$ROOT",
          "else": {
            "results": [
              {
                "_id": <key you want to search>,
                "count": 0
              }
            ]
          }
        }
      }
    }
  },
  {
    "$unwind": "$results"
  },
  {
    "$replaceRoot": {
      "newRoot": "$results"
    }
  }
])

Mongo Playground

相关问题