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