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

How to perform advanced Sub Document Queries in MongoDB?

我有一个模式(案例),它有一个子模式(评估)数组。

我的案例架构如下:

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

我想你需要这样的东西。

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

请注意,您必须使用 $ 运算符,即位置运算符。

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 你可以决定你想要的字段 show/reset/... reference $project

所以在查询字段中添加 caseSchema 就可以了。