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

MongoDB查询lineDetails长度大于2且endDate全不重复的文档

MongoDB指定筛选条件查询语句实现

需求拆解

本次查询需要同时满足两个筛选规则:

  • lineDetails数组长度大于2
  • lineDetails数组中所有元素的endDate字段值没有重复

核心逻辑说明

判断endDate无重复的核心思路:先提取lineDetails数组中所有元素的endDate值生成新数组,再对该新数组去重,若去重后的数组长度和原提取的数组长度完全相等,则说明不存在重复的endDate值。

具体查询语句

普通find查询写法

db.QT_STG.find({
  $expr: {
    $and: [
      // 过滤数组长度大于2的文档
      { $gt: [ { $size: "$lineDetails" }, 2 ] },
      // 过滤endDate无重复的文档
      { $eq: [
          { $size: { $map: { input: "$lineDetails", in: "$$this.endDate" } } },
          { $size: { $setUnion: [ { $map: { input: "$lineDetails", in: "$$this.endDate" } } ] } }
      ] }
    ]
  }
})

聚合管道写法(更适合大数据量场景,提前过滤不符合长度的文档)

db.QT_STG.aggregate([
  // 第一步先过滤掉数组长度不满足要求的文档,减少后续计算量
  {
    $match: {
      $expr: { $gt: [ { $size: "$lineDetails" }, 2 ] }
    }
  },
  // 第二步过滤endDate无重复的文档
  {
    $match: {
      $expr: {
        $eq: [
          { $size: { $map: { input: "$lineDetails", in: "$$this.endDate" } } },
          { $size: { $setUnion: [ { $map: { input: "$lineDetails", in: "$$this.endDate" } } ] } }
        ]
      }
    }
  }
])

运算符说明

  • $expr:支持在查询语句中使用聚合类表达式
  • $size:返回指定数组的元素个数
  • $map:遍历目标数组,按规则返回新数组,这里用于提取所有endDate字段值
  • $setUnion:对输入的数组进行去重处理,返回无重复元素的新数组

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:21:01