【问题标题】:How to perform advanced Sub Document Queries in MongoDB?如何在 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)。但由于这些细节仅在子模式中可用,我不知道如何解决这个问题。而且我也无法将医生字段添加到案例模式中,因为一个案例中可能有很多医生。我正在使用猫鼬。我在互联网上搜索了很多地方,但无法找到解决方案。请帮帮我。

【问题讨论】:

    标签: database mongodb mongoose nosql database-schema


    【解决方案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'的字段。
    • 不客气!请,如果它满足您的要求,请将答案设置为接受。
    猜你喜欢
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    相关资源
    最近更新 更多