MongoDB聚合管道-哪个步骤删除了最后一个文档?
假设一个简单的设置,其中MongoDB聚合管道由两个基本步骤组成:MongoDB聚合管道-哪个步骤删除了最后一个文档?,mongodb,aggregation-framework,Mongodb,Aggregation Framework,假设一个简单的设置,其中MongoDB聚合管道由两个基本步骤组成: 匹配所需文档($match) 检查文件的许可证($redact) 可以这样做 db.thingies.aggregate( [ { $match: { SOME_CONDITION } }, { $redact: { $cond: { if: { SOME_PERMISSION_CHECK }, then: "$$KEEP",
db.thingies.aggregate(
[
{ $match: { SOME_CONDITION } },
{ $redact: {
$cond: {
if: { SOME_PERMISSION_CHECK },
then: "$$KEEP",
else: "$$PRUNE"
}
}
}
]
);
现在假设您执行这个2阶段管道,结果为空。有没有办法确定这是否是:
- a 404:未找到($match结果是emty?),或者
- a 403:禁止($redact结果为空)
简言之,空结果是在第一阶段还是在第二阶段得到的?三个答案,因为有点不清楚你在问什么: 1:如果在程序中运行聚合,并且希望程序立即知道聚合为何有空输出,那么答案是否定的:聚合不会返回该信息,服务器也不会存储该信息。您的程序可能需要运行进一步的查询来查询数据,以确定要采取的进一步操作 2:如果您要求对为什么在特定日期和时间进行特定聚合运行并生成其输出进行回顾性分析,那么答案是否定的:无法确定。您需要的是聚合所有阶段的日志,每个阶段结束时都有完整的结果集;MongoDB不做这种日志记录(这将非常冗长,而且很难管理) 3:如果您需要回顾性分析为什么某个聚合的特定运行会产生其输出,并且您愿意并且能够根据需要手动重建数据并手动重新运行查询,那么调试它以发现每个阶段的效果相当简单:只需注释掉除第一个阶段之外的所有阶段,并运行聚合:
db.thingies.aggregate([
{ $match: { SOME_CONDITION } },
// { $redact: { $cond: { if: { SOME_PERMISSION_CHECK }, then: "$$KEEP", else: "$$PRUNE" } } }
]);
分析该汇总的产出;如果看起来还可以,那么取消对下一阶段的注释,运行聚合,并分析输出-继续进行,直到发现哪个阶段存在问题。这里不清楚您在问什么,充其量您基本上是在问“意见”,这是离题的,不会得到高质量的答案(如果有的话).与其说是理论上的前提,不如让人们知道你在努力实现什么,然后我们就可以给你一个实际的答案,告诉你如何实现这个目标。目前这个问题有太多的概括。如果您想要处理“对象级权限”,那么实际上“向我们展示”需要发生什么以及需要检查什么类型的数据。数据是最重要的。@I我想,你需要定义什么是
一些权限检查,并提供你的数据集@NeilLunn我真的不觉得这个问题太笼统了。我对它进行了一些编辑,但我基本上只是想问,在第2阶段之前,是否有任何方法可以确定管道是否为空$匹配之后是$redact。在达到$redact阶段之前,是否可以判断结果是否为空?我已经删除了正确征求意见的最后一个问题。实际情况/检查对我的要求并不重要。基本上是问?那就不是你想的那样了。但是如果您想要一个真实的答案,那么您需要显示一个带有预期结果的真实文档。这实际上是你在这里提出的问题。看见顺便说一句,我们真的不同意,这就是为什么你吸引了接近票数的选票,以及为什么你被要求在问题结束前澄清这些事情。谢谢你的直截了当的平衡回答。我想我希望得到一个答案,引入一些中间阶段,收集所需的$count,并根据$bucket或类似疯狂的东西添加一个原因。但有时直接的“不”是正确的答案。再次感谢您的态度,非常感谢!