假设一个简单的设置,其中MongoDB聚合管道包含两个基本步骤:
这可以像
那样完成db.thingies.aggregate(
[
{ $match: { SOME_CONDITION } },
{ $redact: {
$cond: {
if: { SOME_PERMISSION_CHECK },
then: "$$KEEP",
else: "$$PRUNE"
}
}
}
]
);
现在假设您执行此2阶段管道,结果为空。有没有办法确定这是否是:
简而言之,第1阶段的结果是空的还是第2阶段达到了?
答案 0 :(得分:0)
三个答案,因为它有点不清楚你在问什么:
1:如果您在程序中运行聚合,并且希望程序立即知道聚合为什么输出为空,那么答案是否定的:聚合不会返回该信息,服务器不存储它。您的程序可能需要运行进一步的查询来询问数据,以找出要采取的进一步行动。
2:如果您要求回顾性地分析为什么特定的聚合运行,在特定的日期和时间提出其输出,那么没有:那里&#39 ; s无法确定。您需要的是聚合的所有阶段的日志,在每个阶段结束时使用完整的结果集;并且MongoDB没有进行那种日志记录(这将非常冗长,并且难以管理)。
3:如果您需要对特定的聚合运行产生其输出的原因进行回顾性分析,并且您愿意并且能够根据需要手动重建数据并手动重新运行查询,那么调试它以找到每个阶段的效果是相当简单的:只需注释掉除第一个阶段以外的所有阶段,然后运行聚合:
db.thingies.aggregate([
{ $match: { SOME_CONDITION } },
// { $redact: { $cond: { if: { SOME_PERMISSION_CHECK }, then: "$$KEEP", else: "$$PRUNE" } } }
]);
分析该聚合的输出;如果看起来没问题,那么取消注释下一阶段,运行聚合,并分析输出 - 继续,直到找到哪个阶段有问题。