即使没有找到匹配的文档,如何分组并返回空结果?

问题描述 投票:0回答:2

我有 2 个疑问:

aggregate( [
  { 
      $match: {"user_id": 5918725, "shop_id": 1775207, "$text": {"$search" : "API"}}
  },
  { 
      $group: { 
          _id: "_id", 
          count: { 
              $sum: { 
                  $cond: [ { $eq: [ "$deleted_at", null ] }, 1, 0 ]  
              } 
          } 
      } 
  }
]);

aggregate( [
  { 
      $match: {"user_id": 5918725, "shop_id": 1775207, "$text": {"$search" : "APIU"}}
  },
  { 
      $group: { 
          _id: "_id", 
          count: { 
              $sum: { 
                  $cond: [ { $eq: [ "$deleted_at", null ] }, 1, 0 ]  
              } 
          } 
      } 
  }
]);

它们是相同的,唯一的区别是搜索关键字,但它们的行为不同, 如果是第一个查询,结果是:

{
    "_id" : null,
    "count" : 0.0
}

这是预期的结果,但对于第二个结果,结果是

Fetched 0 record(s)
(这就是我的 GUI 显示的结果)。因此,出于某种原因,在第二个查询的情况下,它只是忽略组/总和并尝试获取实际记录。怎么解决啊,先谢谢了!

mongodb
2个回答
1
投票

查询

  • 最简单的方法是在驱动程序上执行此操作,如果没有结果,您可以使用代码制作此文档
  • 这是在数据库上执行此操作的方法,有 2 个额外的阶段,union 和 group,以及一个额外的集合(在 mongodb 5.3 中我们不需要额外的集合)
  • 例如,用负数代替 5,即使没有结果,你仍然会得到
    count : 0

在此测试代码

aggregate(
[{"$match":{"$expr":{"$lt":["$a", 5]}}},
 {"$group":{"_id":null, "count":{"$sum":1}}},
 {"$unionWith":{"coll":"2"}},
 {"$group":{"_id":null, "count":{"$sum":"$count"}}}])

0
投票

我是这样解决的。我知道这不是理想的聚合,但我找不到更好的方法来始终具有相同的返回结构......

aggregate([
    {
        $facet: { count: [{ "$count": "aux" }] }
    },
    {
        $addFields: {
            count: {
                $cond: {
                    if: { $eq: [{ $size: "$count" }, 0] },
                    then: 0,
                    else: { $getField: { field: "aux", input: { $first: "$count" } } }
                }
            }
        }
    }
]);

通过这种方法,您还可以在构面中进行 2 个查询,以在单个查询中获取两个结果

© www.soinside.com 2019 - 2024. All rights reserved.