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

MongoDB商品搜索:如何按UPC去重,每个UPC仅返回一条结果?

解决MongoDB关键词搜索后按UPC去重并返回完整记录的问题

你这个需求用distinct满足不了——它只能返回单个字段的去重值,没法拿到包含价格、名称等信息的完整商品文档。正确的做法是用MongoDB的聚合框架来实现,以下是具体方案:

聚合查询实现步骤

  • $match:先筛选出符合关键词搜索条件的文档,和你原find查询的条件一致
  • $sort:按timestamp降序排序,保证每个UPC的最新记录排在分组的最前面
  • $group:以upc为分组依据,用$first提取每个分组的第一条文档(也就是该商品的最新记录)
  • $replaceRoot:将分组后的嵌套文档还原为顶层结构,方便后续处理

替换后的代码

pipeline = [
    # 文本搜索过滤
    {'$match': {'$text': {'$search': search}}},
    # 按时间戳倒序,确保最新的记录在前面
    {'$sort': {'timestamp': -1}},
    # 按UPC分组,取每个组的第一条记录
    {'$group': {
        '_id': '$upc',
        'latest_record': {'$first': '$$ROOT'}
    }},
    # 把嵌套的最新记录还原为顶层文档
    {'$replaceRoot': {'newRoot': '$latest_record'}},
    # 排除不需要的字段
    {'$project': {'Response': 0, '_id': 0}}
]

response = self.DB.aggregate(pipeline)

注意事项

  • 确保你的集合已经创建了文本索引,否则$text搜索会报错,创建索引的命令如下:
    db.your_collection.createIndex({name: "text"})
    
  • 原代码里的f'/{search}/'写法是正则表达式格式,但$text搜索不需要加斜杠,直接传搜索关键词即可;如果需要正则匹配,可以改用$regex,但文本搜索更适合关键词类场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:24:55