【问题标题】:MongoDB aggregate pipeline - which step removed the last document?MongoDB 聚合管道 - 哪一步删除了最后一个文档?
【发布时间】:2018-04-30 19:30:12
【问题描述】:

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

  1. 匹配想要的文档($match)
  2. 检查文档的权限 ($redact)

这可以像

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

现在假设您执行了这个 2 阶段管道,结果为空。有什么方法可以确定这是否是:

  • 404:未找到($match 结果为空?),或
  • 403:禁止($redact 结果为空)

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

【问题讨论】:

  • 目前还不清楚你在这里问什么,充其量你基本上是在问“意见”,这是题外话,不会给你高质量的答案(如果有的话)。而不是理论前提是,您为什么不实际向人们展示您正在努力实现的目标,然后我们实际上可以为您提供有关如何完成目标的事实答案。就目前而言,这个问题有太多的概括性。如果您想处理“对象级权限”,那么实际上“向我们展示”需要发生什么以及需要检查哪些类型的数据。数据是主要的。
  • @Iwallent,您需要定义SOME_PERMISSION_CHECK 的含义,并提供您的data set
  • @NeilLunn 老实说,我不觉得这个问题太笼统。我已经对其进行了一些编辑,但我基本上只是询问是否有任何方法可以确定在第 2 阶段之前管道是否为空。$match 后面是 $redact。可以在到达 $redact 阶段之前判断结果是否为空吗?我删除了最后一个正确征求意见的问题。实际情况/检查对我的要求并不重要。
  • 基本上是在问?然后不是你认为你这样做的方式。但是,如果您想要一个真实的答案,那么您需要展示一个具有预期结果的真实文档。这实际上是您在这里提出的问题的预期。见How to create a Minimal, Complete, and Verifiable example。顺便说一句,我们真的不同意,这就是为什么你会吸引密切的选票,以及为什么你被要求在你的问题结束之前澄清这些事情。

标签: mongodb aggregation-framework


【解决方案1】:

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

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

2:如果您要求对在特定日期和时间的特定聚合运行产生其输出的原因进行回顾性分析,那么不:没有办法知道当然。您需要的是聚合所有阶段的日志,每个阶段结束时都有完整的结果集;并且 MongoDB 不执行那种日志记录(它会非常冗长,并且难以管理)。

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

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

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

【讨论】:

  • 感谢您的直截了当的回答。我想我希望得到一个答案,它引入了一些中间阶段,这些阶段收集了所需的 $count 并添加了一个基于 $bucket 或类似疯狂的原因的原因。但有时直接的“不”是正确的答案。再次感谢您的态度,非常感谢!
猜你喜欢
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多