MongoDB查询:找出至少两天销量相同的销售人员数据
嘿,我来帮你搞定这个需求!要找出至少有两天销量数值相同的销售人员,我们可以利用MongoDB的数组操作特性来实现,下面是两种实用的解决方案:
解决方案
方法一:直接使用find()配合表达式过滤
这种方式简洁高效,适合快速筛选结果。核心思路是:对比原销量数组的长度和去重后的数组长度,如果去重后的长度更小,说明数组里存在重复值(也就是至少两天销量相同)。
db.sales.find({ $expr: { $lt: [ { $size: { $addToSet: "$Sales" } }, // 计算去重后的销量数组长度 { $size: "$Sales" } // 计算原销量数组长度 ] } }, { _id: 1, Sales: 1 }) // 只返回姓名和销量数据
代码逻辑拆解:
$addToSet: "$Sales":对销量数组去重,生成一个没有重复元素的新数组$size:分别获取原数组和去重后数组的元素个数$lt:判断去重后的长度是否小于原长度,如果成立,说明存在至少两个相同的销量数值
方法二:使用聚合管道(适合后续扩展)
如果之后需要对结果做进一步的统计或处理,聚合管道会更灵活,逻辑和方法一一致,只是多了中间字段的计算步骤:
db.sales.aggregate([ // 新增字段,分别存储去重后和原数组的长度 { $addFields: { uniqueSalesCount: { $size: { $addToSet: "$Sales" } }, originalSalesCount: { $size: "$Sales" } } }, // 筛选出存在重复销量的文档 { $match: { $expr: { $lt: ["$uniqueSalesCount", "$originalSalesCount"] } } }, // 只保留需要的字段:姓名和销量 { $project: { _id: 1, Sales: 1 } } ])
关于样本数据的说明
根据你提供的样本数据:
{ "_id" : "Roger", "Sales" : [ 15, 2, 7 ] } { "_id" : "Sally", "Sales" : [ 11, 7, 3 ] } { "_id" : "Patrick", "Sales" : [ 3, 5, 9 ] } { "_id" : "Sarah", "Sales" : [ 9, 21, 11 ] } { "_id" : "Allen", "Sales" : [ 3, 9, 11 ] }
所有销售人员的三天销量都是唯一值,因此运行上述查询后会返回空结果。如果你的数据中存在类似{ "_id": "John", "Sales": [8, 8, 12] }这样的文档,它会被成功筛选出来。
内容的提问来源于stack exchange,提问作者HasanSalah
相关产品推荐
相关产品推荐

