Pymongo查询范围值错误:如何过滤value1_gpu在2-8内的数据
MongoDB聚合查询修正:获取eu-1区域最新数据并过滤value1_gpu范围
问题分析
你的原查询存在关键问题:$match阶段中对data.value1_gpu的范围筛选,只会匹配包含至少一个符合条件元素的整个文档,并不会过滤数组内不符合条件的元素。因此在$unwind展开数组后,像Mary那条value1_gpu=12的记录仍然会被保留,最终分组结果出现超出范围的值。
正确的聚合查询
mongo.instances.aggregate([ # 匹配region为eu-1的文档 {"$match": {"metadata.region": "eu-1"}}, # 按Date降序排序,取最新的一条文档 {"$sort": {"Date": -1}}, {"$limit": 1}, # 展开data数组 {"$unwind": "$data"}, # 过滤data数组中value1_gpu在2-8之间的元素 {"$match": {"data.value1_gpu": {"$gte": 2, "$lte": 8}}}, # 按data.created_date降序,确保分组时取到最新记录 {"$sort": {"data.created_date": -1}}, # 按data.name分组,保留最新记录的字段 {"$group": { "_id": "$data.Name", "latest_created_date": {"$first": "$data.created_date"}, "value1_gpu": {"$first": "$data.value1_gpu"}, "Value3": {"$first": "$data.Value3"} }} ])
关键修正点
- 将
data.value1_gpu的范围筛选从初始$match移到$unwind之后,精准过滤数组中不符合条件的元素。 - 新增对
data.created_date的降序排序,确保分组时$first取到的是每个name组内的最新记录。
预期结果
执行后会得到eu-1区域最新文档(ID=0)中符合value1_gpu范围的分组数据:
- Chris:value1_gpu=2,latest_created_date=2011-04-03
- David:value1_gpu=8,latest_created_date=2011-04-02
内容的提问来源于stack exchange,提问作者RachelS
相关产品推荐
相关产品推荐

