Node.js 在Node/Express应用程序中使用Mongoose/MongoDB从一个模型填充到另一个模型

Node.js 在Node/Express应用程序中使用Mongoose/MongoDB从一个模型填充到另一个模型,node.js,mongodb,express,mongoose-populate,Node.js,Mongodb,Express,Mongoose Populate,我正在努力理解猫鼬中的填充方法,同时在将字段从一个猫鼬模型填充到另一个模型时遇到困难。第一个模型模式是: var MprnSchema = new mongoose.Schema({ mprNo: {type: Number, unique: true, required: true}, siteName: String, buildingNo: Number, streetAddress: String, secondAddress: String,

我正在努力理解猫鼬中的填充方法,同时在将字段从一个猫鼬模型填充到另一个模型时遇到困难。第一个模型模式是:

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,
});
另一种模式是:

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 });   

        });
传递给渲染的对象(queryResults)仅包含错误数据,而不包含应填充的“siteDetails”。我认为问题可能是当我使用Fault.Create()方法时,首先,我是否应该在此时保存对MPRN模型的引用,以便在填充时有一个Id

我收集的样本包括:

故障

  {
    "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。。。所以,你可以试试下面的聚合。。。使用它的好处是,您不需要在
故障
中存储
Mprn
集合的
\u id
。。。您可以使用
mprn
number轻松加入这两个集合

Fault.aggregate([
  { "$match": reportQuery },
  { "$lookup": {
    "from": Mprn.collection.name,
    "let": { "mprNo": "$mprNo" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": [ "$mprNo", "$$mprNo" ] } } }
    ],
    "as": "siteDetails"
  }},
  { "$unwind": "$siteDetails" }
])

你能发布你的样本收集吗?我已经添加了我正在测试的样本收集数据。这些模式实际上更大,我已将它们截断到最小值,并添加了适用的测试数据。这两个集合中的公共(匹配键)是哪一个?您的mongodb版本是什么?很抱歉,关键是在每个集合中匹配的mprNo(我已经更新了mprNo值),mongodb版本是V4.0.0Thanks,但我不确定如何在express/Node路由中使用它?这是一个聚合查询,就像mongodb的find查询一样,也是填充查询的替代。。。只需将其替换为find().populate()查询,它将同样工作,并给出所需的结果。。。使用此查询后,您将了解到许多关于mongodb的信息……感谢您的帮助,但现在我发现db没有定义,我应该用其他东西替换db吗?我今天有严重的大脑冻结…应该是
故障
。。。和
Mprn.collection.name
是您的
Mprn
集合的名称。。。您需要导入它,因为您已经导入了
Fault
感谢它的工作!我现在要去更深入的调查。谢谢你的帮助!