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

