如何在 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 中执行高级子文档查询?的主要内容,如果未能解决你的问题,请参考以下文章