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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:48:09