如何检测MongoDB集合中同一产品是否存在多个价格值?
问题
我的集合结构如下:
[ { "_id": "some value", "product/productId": "some value", "product/title": "some value", "product/price": "unknown" }, { "_id": "some value", "product/productId": "some value", "product/title": "some value", "product/price": "12.57" } ]
需求:检测是否存在同一产品(按product/productId区分)拥有多个不同的product/price值,其中product/price的取值可为"unknown"或数值型字符串(如"12.75")。请问能否通过MongoDB聚合管道实现该需求,还是需要使用Map-Reduce算法?
解决方案
完全可以用MongoDB聚合管道实现,不需要使用Map-Reduce。以下是具体的聚合管道脚本:
db.yourCollectionName.aggregate([ // 按productId分组,收集该产品所有不重复的price值 { $group: { _id: "$product/productId", distinctPrices: { $addToSet: "$product/price" }, productTitle: { $first: "$product/title" } // 可选,保留产品标题便于查看 } }, // 筛选出存在多个不同price值的产品 { $match: { $expr: { $gt: [ { $size: "$distinctPrices" }, 1 ] } } }, // 可选:调整输出格式,让结果更清晰 { $project: { productId: "$_id", productTitle: 1, conflictingPrices: "$distinctPrices", _id: 0 } } ])
步骤说明:
- $group阶段:以
product/productId为分组依据,通过$addToSet自动去重,收集该产品下所有不同的price值到distinctPrices数组中。 - $match阶段:过滤出
distinctPrices数组长度大于1的分组,这类分组对应的就是存在多个不同价格的产品。 - $project阶段:可选步骤,重新命名输出字段、调整结构,让结果可读性更强。
注意事项:
- 请将脚本中的
yourCollectionName替换为你的实际集合名称。 - 脚本默认将"unknown"和数值型字符串视为不同值,符合需求中的检测逻辑。
内容的提问来源于stack exchange,提问作者duje.je
相关产品推荐
相关产品推荐

