如何在 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
就可以了。
我有一个模式(案例),它有一个子模式(评估)数组。
我的案例架构如下:
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
就可以了。