如何在子对象双键上查询匹配:筛选指定艺术家且分数≥500的用户
筛选符合条件的用户列表解决方案
嘿,我来帮你搞定这个查询需求!咱们的目标是从给定的用户数据集中,找出喜欢指定艺术家,且该艺术家对应的score字段值≥500的用户列表。
先明确需求细节
我们需要匹配的是:用户的artists数组中,至少存在一个元素同时满足两个条件:
id等于目标艺术家IDscore大于或等于500
针对不同场景的查询实现
1. MongoDB(文档型数据库)
假设你的数据存储在MongoDB的users集合中,目标艺术家ID为246,可以用$elemMatch操作符精准匹配数组元素的多条件:
db.users.find({ "artists": { "$elemMatch": { "id": 246, "score": { "$gte": 500 } } } })
效果验证:用你提供的示例数据,这个查询会返回profile: 24680的文档(其artists数组里id=246的元素score=500,刚好满足≥500的条件)。
2. 关系型数据库(比如MySQL)
如果数据拆分存储在两张表中:
profiles表:存储用户基础信息,字段profile_idartist_scores表:存储用户对艺术家的评分,字段profile_id、artist_id、score
可以用关联查询实现:
SELECT p.profile_id FROM profiles p JOIN artist_scores s ON p.profile_id = s.profile_id WHERE s.artist_id = 246 AND s.score >= 500 GROUP BY p.profile_id
逻辑说明:通过profile_id关联两张表,筛选出目标艺术家且评分达标的记录,最后分组去重得到唯一的用户ID列表。
3. Python处理JSON数组
如果是在代码里直接处理JSON格式的数据集,用列表推导式就能快速筛选:
# 假设data是你的用户数据集列表 target_artist_id = 246 filtered_users = [user for user in data if any(artist["id"] == target_artist_id and artist["score"] >= 500 for artist in user["artists"])]
这个代码会遍历所有用户,检查其artists数组中是否存在符合条件的艺术家,最终返回符合要求的用户列表。
内容的提问来源于stack exchange,提问作者Mike Smedley
相关产品推荐
相关产品推荐

