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
相关产品推荐
相关产品推荐

