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

标签 node.js mongodb express mongoose-populate

我很难理解 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 });   

        });

传递给要呈现的对象 (queryResults) 只包含 Fault 数据,而不是应该填充的“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...所以,您可以尝试以下 $lookup聚合...使用它的优点是您不需要将 Mprn 集合的 _id 存储在 Fault...您可以使用 mprn number

轻松加入这两个集合
Fault.aggregate([
  { "$match": reportQuery },
  { "$lookup": {
    "from": Mprn.collection.name,
    "let": { "mprNo": "$mprNo" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": [ "$mprNo", "$$mprNo" ] } } }
    ],
    "as": "siteDetails"
  }},
  { "$unwind": "$siteDetails" }
])

关于node.js - 在 Node/Express 应用程序中使用 Mongoose/MongoDB 从一个模型填充到另一个模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51580808/

相关文章:

Ubuntu下的MongoDB密码

node.js - mongoose Model.update() - 仅更新提供的值

javascript - POST 请求 - 不适用于 Node 和 Express

javascript - Sinon - 带有回调的 stub 函数 - 导致测试方法超时

linux - 如何在 CygWin 上使用连接代理

javascript - 使用 Node.JS 作为 REST 服务器和 Web 服务器

jquery - Nodejs 和 Expressjs 发送 ajax post 请求

node.js - 错误 C2039: 'IsNearDeath' : 不是 'Nan::Persistent<v8::Object,v8::NonCopyablePersistentTraits<T>> 的成员

javascript - 无法从 Mongoose then 语句插入数组

node.js - Mongoose: CastError: 转换为 ObjectId 失败,路径 “me” 处的值 “_id”