在 Node/Express 应用程序中使用 Mongoose/MongoDB 从一个模型填充到另一个模型
Populate from One Model to Another Using Mongoose/MongoDB in Node/Express Application
我很难理解 Mongoose 中的 populate 方法,同时在将字段从一个 Mongoose 模型填充到另一个模型时遇到问题。第一个模型架构是:
var MprnSchema = new mongoose.Schema({
mprNo: {type: Number, unique: true, required: true},
siteName: String,
buildingNo: Number,
streetAddress: String,
secondAddress: String,
townCity: String,
postCode: String,
supplier: String,
siteContactName: String,
siteContactNo: String,
});
module.exports = mongoose.model("Mprn", MprnSchema);
另一个架构是:
var FaultSchema = new mongoose.Schema({
jobRef: Number,
mprNo: Number,
requestedDate: {type: Date, default: Date.now},
attendedDate: {type: Date, default: null},
siteDetails: {type: mongoose.Schema.Types.ObjectId, ref: 'Mprn'},
faultIssue: String,
});
但是,当我尝试使用 Mprn 的内容填充 'siteDetails' 时,使用以下代码时我得到 []:
Fault.find(reportQuery).populate('siteDetails', 'siteName
postCode').exec((err, faultResults) => {
if(err){
req.flash("error", err.message);
res.redirect("/");
}
console.log(faultResults);
res.render("reportResults", { queryResults: faultResults });
});
要呈现的 object (queryResults) 仅包含 Fault 数据而不包含 'siteDetails' 应该填充。我认为问题可能出在我首先使用 Fault.Create() 方法时,此时我是否应该保存对 MPRN 模型的引用,以便有一个 Id 填充时要引用?
我的样本 collections 是:
故障
{
"jobRef": 60000,
"mprNo": 123456,
"faultIssue": "Test"
}
Mprn
{
"mprNo": 123456,
"siteName": "Smithson Gates",
"buildingNo": 76,
"streetAddress": "Garden Place",
"secondAddress": "Greater Manchester",
"townCity": "Salford",
"postCode": "M5 3AP",
"supplier": "test",
"siteContactName": "Mr B Jones",
"siteContactNo": "0161 000 0000"
}
您使用的是最新版本的 mongodb...所以,您可以尝试下面的 $lookup
聚合...使用它的优点是您不需要存储Fault
中 Mprn
个集合的 _id
...您可以使用 mprn
编号
轻松加入两个集合
Fault.aggregate([
{ "$match": reportQuery },
{ "$lookup": {
"from": Mprn.collection.name,
"let": { "mprNo": "$mprNo" },
"pipeline": [
{ "$match": { "$expr": { "$eq": [ "$mprNo", "$$mprNo" ] } } }
],
"as": "siteDetails"
}},
{ "$unwind": "$siteDetails" }
])
我很难理解 Mongoose 中的 populate 方法,同时在将字段从一个 Mongoose 模型填充到另一个模型时遇到问题。第一个模型架构是:
var MprnSchema = new mongoose.Schema({
mprNo: {type: Number, unique: true, required: true},
siteName: String,
buildingNo: Number,
streetAddress: String,
secondAddress: String,
townCity: String,
postCode: String,
supplier: String,
siteContactName: String,
siteContactNo: String,
});
module.exports = mongoose.model("Mprn", MprnSchema);
另一个架构是:
var FaultSchema = new mongoose.Schema({
jobRef: Number,
mprNo: Number,
requestedDate: {type: Date, default: Date.now},
attendedDate: {type: Date, default: null},
siteDetails: {type: mongoose.Schema.Types.ObjectId, ref: 'Mprn'},
faultIssue: String,
});
但是,当我尝试使用 Mprn 的内容填充 'siteDetails' 时,使用以下代码时我得到 []:
Fault.find(reportQuery).populate('siteDetails', 'siteName
postCode').exec((err, faultResults) => {
if(err){
req.flash("error", err.message);
res.redirect("/");
}
console.log(faultResults);
res.render("reportResults", { queryResults: faultResults });
});
要呈现的 object (queryResults) 仅包含 Fault 数据而不包含 'siteDetails' 应该填充。我认为问题可能出在我首先使用 Fault.Create() 方法时,此时我是否应该保存对 MPRN 模型的引用,以便有一个 Id 填充时要引用?
我的样本 collections 是:
故障
{
"jobRef": 60000,
"mprNo": 123456,
"faultIssue": "Test"
}
Mprn
{
"mprNo": 123456,
"siteName": "Smithson Gates",
"buildingNo": 76,
"streetAddress": "Garden Place",
"secondAddress": "Greater Manchester",
"townCity": "Salford",
"postCode": "M5 3AP",
"supplier": "test",
"siteContactName": "Mr B Jones",
"siteContactNo": "0161 000 0000"
}
您使用的是最新版本的 mongodb...所以,您可以尝试下面的 $lookup
聚合...使用它的优点是您不需要存储Fault
中 Mprn
个集合的 _id
...您可以使用 mprn
编号
Fault.aggregate([
{ "$match": reportQuery },
{ "$lookup": {
"from": Mprn.collection.name,
"let": { "mprNo": "$mprNo" },
"pipeline": [
{ "$match": { "$expr": { "$eq": [ "$mprNo", "$$mprNo" ] } } }
],
"as": "siteDetails"
}},
{ "$unwind": "$siteDetails" }
])