MongoDB可变嵌套字段数据查询:查找指定人员相关记录
查询MongoDB中嵌套动态键文档的特定条件记录
刚接触MongoDB遇到这种带动态键的嵌套对象查询确实容易卡壳,我来帮你一步步解决这个问题。首先看你的文档结构,visits和samples都是动态键的嵌套对象(键是日期/样本ID,不是固定字段名),这也是普通正则查询没效果的核心原因——没法直接针对不确定的键做匹配。
单个条件查询示例
1. 查询所有由Tim录入的就诊记录
我们可以用$objectToArray把动态键的对象转换成数组(格式为[{k: "键名", v: "键值"}]),再用$anyElementMatch检查数组里是否有符合条件的元素:
db.collection.find({ $expr: { $anyElementMatch: [ { $objectToArray: "$visits" }, { "v.entered_by": "Tim" } ] } })
2. 查询所有由Sally收集的样本
逻辑和上面一致,只是转换的是samples对象,检查的是collected_by字段:
db.collection.find({ $expr: { $anyElementMatch: [ { $objectToArray: "$samples" }, { "v.collected_by": "Sally" } ] } })
合并两个条件的查询
如果需要同时满足“由Sally收集样本”或“由Tim录入就诊记录”的条件,用$or把两个查询组合起来就行:
db.collection.find({ $or: [ { $expr: { $anyElementMatch: [ { $objectToArray: "$visits" }, { "v.entered_by": "Tim" } ] } }, { $expr: { $anyElementMatch: [ { $objectToArray: "$samples" }, { "v.collected_by": "Sally" } ] } } ] })
额外建议:优化文档结构
如果后续还有类似查询需求,建议把visits和samples改成数组结构,比如:
"visits": [ { "visit_date": "1/1/18", "date_entered": "1/2/18", "entered_by": "Sally" }, { "visit_date": "1/2/18", "date_entered": "1/2/18", "entered_by": "Tim" } ], "samples": [ { "sample_id": "XXX123", "collected_by": "Sally", "collection_date": "1/3/18" } ]
这种结构下查询会更直观,比如直接用db.collection.find({"visits.entered_by": "Tim"})就能匹配,还能针对字段建立索引提升查询性能。
内容的提问来源于stack exchange,提问作者jester_in_yellow
相关产品推荐
相关产品推荐

