You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于MongoDB Schema实现自定义过滤器完成复杂查询并支持分页?

实现方案

使用MongoDB聚合的$redact阶段可以完全匹配你的自定义过滤逻辑,且原生支持分页查询,无需拉取全量数据到服务端处理,具体实现代码如下:

const result = await User.aggregate([
  // 可在此处先加$match阶段提前过滤无效数据,优化查询性能
  {
    $redact: {
      $cond: {
        if: {
          $or: [
            // 匹配摄氏度大于36的场景
            {
              $and: [
                { $eq: ["$temperature.mesure", "C"] },
                { $gt: ["$temperature.value", 36] }
              ]
            },
            // 匹配华氏度转摄氏度后大于36的场景
            {
              $and: [
                { $eq: ["$temperature.mesure", "F"] },
                { $gt: [ { $multiply: [ { $subtract: ["$temperature.value", 32] }, 5/9 ] }, 36 ] }
              ]
            }
          ]
        },
        then: "$$KEEP", // 符合条件保留文档
        else: "$$PRUNE" // 不符合条件直接剔除
      }
    }
  },
  // 直接追加分页逻辑,和find查询的分页用法完全对齐
  { $skip: 0 },
  { $limit: 10 }
])

逻辑说明

  • 上述聚合逻辑完全对齐你给出的自定义函数规则,所有运算全部在数据库层执行,不会拉取全量数据到服务端处理,性能远高于全量查询后再做数组过滤
  • 华氏度转摄氏度逻辑直接通过MongoDB内置算术运算符实现,对应(华氏度数值 - 32) * 5 / 9的转换公式,和你自定义的convertToCel逻辑一致
  • $redact阶段后可直接追加$skip、$limit、$sort等聚合阶段,完全满足你的分页需求

性能优化建议

如果你的数据集较大,可在$redact阶段前新增$match阶段,提前过滤掉肯定不符合要求的文档(比如没有temperature字段、temperature.value为无效值的文档),减少$redact的扫描数据量,进一步提升查询效率。

内容的提问来源于stack exchange,提问作者Scoopa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 05:06:02