MongoDB聚合管道 - 哪一步删除了最后一个文档?

时间:2018-04-30 19:30:12

标签: mongodb aggregation-framework

假设一个简单的设置,其中MongoDB聚合管道包含两个基本步骤:

  1. 匹配所需文件($ match)
  2. 检查对文件的批准($ redact)
  3. 这可以像

    那样完成
    db.thingies.aggregate(
       [
         { $match: { SOME_CONDITION } },
         { $redact: {
            $cond: {
               if: { SOME_PERMISSION_CHECK },
               then: "$$KEEP",
               else: "$$PRUNE"
             }
           }
         }
       ]
    );
    

    现在假设您执行此2阶段管道,结果为空。有没有办法确定这是否是:

    • 404:NOT-FOUND($ match结果是emty?),或
    • a 403:FORBIDDEN($ redact结果为空)

    简而言之,第1阶段的结果是空的还是第2阶段达到了?

1 个答案:

答案 0 :(得分:0)

三个答案,因为它有点不清楚你在问什么:

1:如果您在程序中运行聚合,并且希望程序立即知道聚合为什么输出为空,那么答案是否定的:聚合不会返回该信息,服务器不存储它。您的程序可能需要运行进一步的查询来询问数据,以找出要采取的进一步行动。

2:如果您要求回顾性地分析为什么特定的聚合运行,在特定的日期和时间提出其输出,那么没有:那里&#39 ; s无法确定。您需要的是聚合的所有阶段的日志,在每个阶段结束时使用完整的结果集;并且MongoDB没有进行那种日志记录(这将非常冗长,并且难以管理)。

3:如果您需要对特定的聚合运行产生其输出的原因进行回顾性分析,并且您愿意并且能够根据需要手动重建数据并手动重新运行查询,那么调试它以找到每个阶段的效果是相当简单的:只需注释掉除第一个阶段以外的所有阶段,然后运行聚合:

db.thingies.aggregate([
    { $match: { SOME_CONDITION } },
    // { $redact: { $cond: { if: { SOME_PERMISSION_CHECK }, then: "$$KEEP", else: "$$PRUNE" } } }
]);

分析该聚合的输出;如果看起来没问题,那么取消注释下一阶段,运行聚合,并分析输出 - 继续,直到找到哪个阶段有问题。