【问题标题】:Populate from One Model to Another Using Mongoose/MongoDB in Node/Express Application在 Node/Express 应用程序中使用 Mongoose/MongoDB 从一个模型填充到另一个模型
【发布时间】:2019-01-05 22:15:29
【问题描述】:

我很难理解 Mongoose 中的 populate 方法,同时在将字段从一个 Mongoose 模型填充到另一个模型时遇到问题。第一个模型Schema是:

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"
 }

【问题讨论】:

  • 你能发布你的样本集吗?
  • 我已经添加了我正在测试的收集数据。这些 Schema 实际上更大,我已将它们截断到最低限度,并添加了适用的测试数据。
  • 这两个集合中的共同点(匹配键)是什么?你的 mongodb 版本是什么?
  • 抱歉,关键是每个集合中匹配的mprNo(我已经更新了mprNo值),MongoDB版本是V4.0.0

标签: node.js mongodb express mongoose-populate


【解决方案1】:

你使用的是最新版本的 mongodb...所以,您可以尝试下面的 $lookup 聚合...使用它的好处是您不需要存储 Mprn 集合的 _idFault...中,您可以使用mprn 号码轻松加入这两个集合

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

【讨论】:

  • 谢谢,但我不确定如何在 express/Node 路由中使用它?
  • 这是一个聚合查询,就像 mongodb 的 find 查询一样,也是 populate 查询的替代...只需将其替换为您的 find().populate() 查询,它的工作方式相同并给出你想要的结果......使用这个查询后你会学到很多关于 mongodb 的东西......
  • 感谢您的所有帮助,但现在我得到 db 未定义,我应该用其他东西替换 db 吗?我今天脑部严重冻结......
  • 它应该是Fault... 而Mprn.collection.name 是您的Mprn 集合的名称... 您只需导入它就可以导入Fault
  • 感谢它的工作!我现在要更深入地研究聚合。感谢您的所有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
  • 2019-05-17
  • 1970-01-01
  • 2017-06-02
  • 2018-10-25
  • 2019-04-09
  • 2011-12-22
相关资源
最近更新 更多