如何在 MongoDB 中执行高级子文档查询?

Posted

技术标签:

【中文标题】如何在 MongoDB 中执行高级子文档查询?【英文标题】:How to perform advanced Sub Document Queries in MongoDB? 【发布时间】:2021-02-04 08:25:10 【问题描述】:

我有一个 Schema(Case),它有一个 Sub Schema(Assessment) 数组。

我的案例架构如下:

const caseSchema = new mongoose.Schema(
    patient: 
        type: String,
        default: 'Password can\'t be empty' 
    
    description: 
        type: String,
        required: 'Case description can\'t be empty'
    ,
    assessments: [assessmentSchema]
);

我的评估架构如下

const assessmentSchema = new mongoose.Schema(
    doctor: 
        type: String,
        required: 'Doctor can\'t be empty'
    ,
    doa: Date,
    slots: String
);

我的问题是找到整个集合中的所有评估文件(指定医生和doa)。但由于这些细节仅在子模式中可用,我不知道如何解决这个问题。而且我也无法将医生字段添加到案例模式中,因为一个案例中可能有很多医生。我正在使用猫鼬。我在互联网上搜索了很多地方,但无法找到解决方案。请帮帮我。

【问题讨论】:

【参考方案1】:

我认为你需要这样的东西。

这是一个聚合,其中$project 阶段用于传递具有请求字段的文档。 传递到下一阶段的字段是与过滤器匹配的字段。 在过滤器中,我们使用$eq 条件来检查“医生”和“插槽”字段。

注意一定要用$操作符,也就是位置操作符。

db.collection.aggregate([
  
    "$project": 
      "_id": 0,
      "assessments": 
        "$filter": 
          "input": "$assessments",
          "as": "ass",
          "cond": 
            "$eq": [
              "$$ass.doctor",
              "doctor1"
            ],
            "$eq": [
              "$$ass.slots",
              "slots1"
            ]
          
        
      
    
  
])

这里是游乐场example

编辑:通过这个新查询,您可以获得所需的所有字段。

db.collection.aggregate([
  
    "$project": 
      "patient": 1,
      "description": 1,
      "assessments": 
        "$filter": 
          "input": "$assessments",
          "as": "as",
          "cond": 
            "$eq": [
              "$$as.doctor",
              "doctor1"
            ],
            "$eq": [
              "$$as.slots",
              "slots1"
            ]
          
        
      
    
  
])

请注意,只有一点区别。 进入$project,您可以决定要显示/重置/的字段...reference $project

因此,将caseSchema 添加到查询字段中就可以了。

【讨论】:

我应该怎么做才能在结果中包含患者字段(caseSchema)?非常感谢 嗨,我已经更新了答案。就是这么简单,只在$project下面标明你想显示为'1'的字段。 不客气!请,如果它满足您的要求,请将答案设置为接受。

以上是关于如何在 MongoDB 中执行高级子文档查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 mongoose/mongodb 查询子文档中使用 mapreduce?

MongoDB - 对时间序列子文档进行范围查询

如何在不同深度内搜索 MongoDB 嵌套子文档

如何在不同深度内搜索 MongoDB 嵌套子文档

Mongodb + C#:如何查询子文档并按其最常用的顺序

MongoDB - 时间序列子文档的范围查询