如何填充 Mongoose 数组中的字段?
How to populate an field in array of Mongooese?
我有一个这样的集合架构:
const PrescriptionSchema = new Schema({
patientId:{type: mongoose.Schema.ObjectId, ref: 'User'},
prescriptionName: String,
prescriptionNote: String,
prescriptionDate: Date,
diseaseId: {type: mongoose.Schema.ObjectId, ref: 'Diseases'},
drugs: [{
drugcateId:{type: mongoose.Schema.ObjectId, ref: 'DrugCategory'},
quantity: Number,
howtouse: String
}],
is_deleted: {type: Boolean, default: false},
createdBy: {type: mongoose.Schema.ObjectId, ref: 'User'}
}, {
timestamps: true,
collection: 'prescriptions'
}
);
export default mongoose.model('prescriptions', PrescriptionSchema );
请注意,在这个集合中我有一组“药物”,这是我从 'DrugCategory' 获得的一组药物,在每种药物中我都有数量和使用方法..所以我把它分组(drugCateId, quantity, howtouse) 在药物数组中。
当我找到处方时,我想将 drugCateId 填充到 drugs 数组中。我该怎么做?
以下是我当前的代码:
async findOne(req, res){
const { id } = req.params;
await Prescriptions.
findOne({ is_deleted: false, _id: id}).
.populate(
{
path: 'drugs',
populate: {
path: 'drugCateId',
model: 'DrugCategory'
}
}).
exec(function (err, data) {
if (err) return handleError(err);
res.send(data)
});
}
但这行不通。
以下是我的结果:
{
"is_deleted": false,
"_id": "5f32768a06693a520806717d",
"patientId": "5c80930d447df7735138693e",
"prescriptionName": "Prescription for you",
"prescriptionNote": "Please drink follow doctor",
"prescriptionDate": "2020-07-08T00:00:00.000Z",
"diseaseId": "5f22a6d600980c081ca9e14f",
"drugs": [
{
"_id": "5f32768a06693a5208067181",
"drugcateId": "5f23deca04e3150a48632229", // How can I populate this one?
"quantity": 10,
"howtouse": "drink 2 times after meal everyday"
},
{
"_id": "5f32768a06693a5208067180",
"drugcateId": "5f23deca04e3150a48632233", // How can I populate this one?
"quantity": 10,
"howtouse": "drink 2 times after meal everyday"
},
{
"_id": "5f32768a06693a520806717f",
"drugcateId": "5f23deca04e3150a48632234", // How can I populate this one?
"quantity": 10,
"howtouse": "drink 2 times after meal everyday"
},
{
"_id": "5f32768a06693a520806717e",
"drugcateId": "5f23deca04e3150a4863224a", // How can I populate this one?
"quantity": 10,
"howtouse": "drink 2 times after meal everyday"
}
],
"createdBy": "5d1cd947231ceb95b8838c1b",
"createdAt": "2020-08-11T10:44:26.842Z",
"updatedAt": "2020-08-11T10:44:26.842Z",
"__v": 0
}
希望你理解我的问题,请看一看。谢谢
你看起来很接近,但一定要提供正确的路径:
.populate({
path: 'drugcateId',
model: 'DrugCategory'
})
将 drugCateId
更改为 drugcateId
。
此外,您应该能够直接填充 DrugCategory
。
您当前的版本与您的架构不匹配。它建议您同时填充 drugs
和 drugs.drugcateId
。但是这里 drugs
是直接嵌入的,而不是对另一个集合中文档的引用,所以不可能 populate()
:
.populate({
path: 'drugs', // this assumes drugs are objectIds: [{ type: ObjectId, ref: 'Drug' }]
populate: {
path: 'drugCateId',
model: 'DrugCategory'
}
})
相反,您应该能够对数组使用 dot-notation:
.populate({ path: "drugs.drugcateId" })
或短
.populate("drugs.drugcateId")
感谢您的回复。我有一个错误,我的模型是“drugcate”,但在我的填充命令中是“drugCate”。我已经将我的模型更改为“drugCate”并且下面的查询有效。
populate({ path: 'drugs.drugCateId',
populate: {path: 'drugs.drugCateId'}
})
谢谢
我有一个这样的集合架构:
const PrescriptionSchema = new Schema({
patientId:{type: mongoose.Schema.ObjectId, ref: 'User'},
prescriptionName: String,
prescriptionNote: String,
prescriptionDate: Date,
diseaseId: {type: mongoose.Schema.ObjectId, ref: 'Diseases'},
drugs: [{
drugcateId:{type: mongoose.Schema.ObjectId, ref: 'DrugCategory'},
quantity: Number,
howtouse: String
}],
is_deleted: {type: Boolean, default: false},
createdBy: {type: mongoose.Schema.ObjectId, ref: 'User'}
}, {
timestamps: true,
collection: 'prescriptions'
}
);
export default mongoose.model('prescriptions', PrescriptionSchema );
请注意,在这个集合中我有一组“药物”,这是我从 'DrugCategory' 获得的一组药物,在每种药物中我都有数量和使用方法..所以我把它分组(drugCateId, quantity, howtouse) 在药物数组中。 当我找到处方时,我想将 drugCateId 填充到 drugs 数组中。我该怎么做? 以下是我当前的代码:
async findOne(req, res){
const { id } = req.params;
await Prescriptions.
findOne({ is_deleted: false, _id: id}).
.populate(
{
path: 'drugs',
populate: {
path: 'drugCateId',
model: 'DrugCategory'
}
}).
exec(function (err, data) {
if (err) return handleError(err);
res.send(data)
});
}
但这行不通。 以下是我的结果:
{
"is_deleted": false,
"_id": "5f32768a06693a520806717d",
"patientId": "5c80930d447df7735138693e",
"prescriptionName": "Prescription for you",
"prescriptionNote": "Please drink follow doctor",
"prescriptionDate": "2020-07-08T00:00:00.000Z",
"diseaseId": "5f22a6d600980c081ca9e14f",
"drugs": [
{
"_id": "5f32768a06693a5208067181",
"drugcateId": "5f23deca04e3150a48632229", // How can I populate this one?
"quantity": 10,
"howtouse": "drink 2 times after meal everyday"
},
{
"_id": "5f32768a06693a5208067180",
"drugcateId": "5f23deca04e3150a48632233", // How can I populate this one?
"quantity": 10,
"howtouse": "drink 2 times after meal everyday"
},
{
"_id": "5f32768a06693a520806717f",
"drugcateId": "5f23deca04e3150a48632234", // How can I populate this one?
"quantity": 10,
"howtouse": "drink 2 times after meal everyday"
},
{
"_id": "5f32768a06693a520806717e",
"drugcateId": "5f23deca04e3150a4863224a", // How can I populate this one?
"quantity": 10,
"howtouse": "drink 2 times after meal everyday"
}
],
"createdBy": "5d1cd947231ceb95b8838c1b",
"createdAt": "2020-08-11T10:44:26.842Z",
"updatedAt": "2020-08-11T10:44:26.842Z",
"__v": 0
}
希望你理解我的问题,请看一看。谢谢
你看起来很接近,但一定要提供正确的路径:
.populate({
path: 'drugcateId',
model: 'DrugCategory'
})
将 drugCateId
更改为 drugcateId
。
此外,您应该能够直接填充 DrugCategory
。
您当前的版本与您的架构不匹配。它建议您同时填充 drugs
和 drugs.drugcateId
。但是这里 drugs
是直接嵌入的,而不是对另一个集合中文档的引用,所以不可能 populate()
:
.populate({
path: 'drugs', // this assumes drugs are objectIds: [{ type: ObjectId, ref: 'Drug' }]
populate: {
path: 'drugCateId',
model: 'DrugCategory'
}
})
相反,您应该能够对数组使用 dot-notation:
.populate({ path: "drugs.drugcateId" })
或短
.populate("drugs.drugcateId")
感谢您的回复。我有一个错误,我的模型是“drugcate”,但在我的填充命令中是“drugCate”。我已经将我的模型更改为“drugCate”并且下面的查询有效。
populate({ path: 'drugs.drugCateId',
populate: {path: 'drugs.drugCateId'}
})
谢谢