【问题标题】:How to populate multiple collections in mongoose nodejs and ejs如何在猫鼬 nodejs 和 ejs 中填充多个集合
【发布时间】:2021-08-04 17:49:40
【问题描述】:

上下文:所以我正在尝试使用 ejs nodejs express 和 mongoose 制作一个产品管理系统,用户可以将产品发布给特定员工,然后也可以退回。我遇到的问题是,在退回产品后,我无法同时在 ejs 文件中填充产品和员工集合。我已经尝试了很多搜索,但无法找到解决方案。

这是返回控制器的代码

const issue_return_details = (req, res) => {
    var perPage = 3;
    var page = req.params.page || 1;
    IssueBack.find()
    .skip((perPage * page) - perPage)
    .limit(perPage)
    .populate([{ path: "issue", 
     populate: { path: "product", // works
     populate : { path: "category", // works
     populate : { path: "employee"}}}}]) // doesnt work
    .then((issueback) => {
      IssueBack.count().then((count) => {
        res.render("products/issue/returnDetails", {
          user: req.user,
          issueback: issueback,
          current : page,
          pages : Math.ceil(count / perPage),
          message: req.flash("success_msg"),
        });
      })
    })
    .catch((err) => {
      console.log(err);
    });
};

注意

现在,如果我与员工切换产品,那么我可以呈现所有员工信息,但产品和类别停止工作。

图片供参考

这是产品人口优先

现在我和员工换产品

const issue_return_details = (req, res) => {
    var perPage = 3;
    var page = req.params.page || 1;
    IssueBack.find()
    .skip((perPage * page) - perPage)
    .limit(perPage)
    .populate([{ path: "issue", 
     populate: { path: "employee",
     populate : { path: "category", 
     populate : { path: "product"}}}}])
    .then((issueback) => {
      IssueBack.count().then((count) => {
        res.render("products/issue/returnDetails", {
          user: req.user,
          issueback: issueback,
          current : page,
          pages : Math.ceil(count / perPage),
          message: req.flash("success_msg"),
        });
      })
    })
    .catch((err) => {
      console.log(err);
    });
};

相关的 Ejs 代码

        <% if (issueback.length> 0) { %> <% issueback.forEach(issueback=> { %>
        <tr>
          <td><%= issueback.issue.employee.ename %></td>
          <td><%= issueback.issue.employee.email %></td>
          <td><%= issueback.issue.employee.enumber %></td>
          <td><%= issueback.issue.employee.cnumber %></td>
          <td><%= issueback.issue.product.prodid %></td>
          <td><%=issueback.issue.product.title %></td>
          <td><%=issueback.issue.product.manufacturer %></td>
          <td><%=issueback.issue.product.category.title %></td>
          <% var date = issueback.returnTime %> <% var formated =
          date.toLocaleString(date); %>
          <td><%= formated %></td>
          <td><%= issueback.qty %></td>

返回模型(mongodb 中的回溯)

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const issueBackSchema = new Schema({
    remarks: {
        type: String,
        required: true
    },
    qty: {
        type: Number,
        default: 0
    },  
    issue: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'issue'
    },
    returnTime: {
        type: Date,
        default: Date.now()
    }
});

const IssueBack = mongoose.model('issueBack',issueBackSchema);

module.exports = IssueBack;

问题模型

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const issueSchema = new Schema({
    employee: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'employee'
    },
    status: {
        type: Boolean,
        default: false
    },
    description: {
        type: String,
        required: true
    },
    qty: {
        type: Number,
        default: 0
    },  
    product: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Prodcut'
    },
    issueTime: {
        type: Date,
        default: Date.now()
    }
});

const Issue = mongoose.model('issue',issueSchema);

module.exports = Issue;

产品型号

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const productSchema = new Schema({
    prodid: {
        type: String,
        required: true
    },
    title: {
        type: String,
        required: true
    },
    manufacturer: {
        type: String,
        required: true
    },
    qty:{
        type: Number,
        default: 0
    },
    category: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'category'
    },
    prange:{
        type: String
    },
    pdate:{
        type: Date
    },
    wdate:{
        type: Date
    },
    desc: {
       type: String 
    },
    user:{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
    },
    coverImage: {
        type: Buffer,
        required: true
    },
    coverImageType: {
        type: String,
        required: true
    }
}, { timestamps: true });

productSchema.virtual('coverImagePath').get(function() {
    if (this.coverImage != null && this.coverImageType != null) {
      return `data:${this.coverImageType};charset=utf-8;base64,${this.coverImage.toString('base64')}`
    }
  });

const Prodcut = mongoose.model('Prodcut',productSchema);

module.exports = Prodcut;

提前致谢。

【问题讨论】:

    标签: node.js mongodb express mongoose ejs


    【解决方案1】:

    试试这个。你必须嵌套你的填充对象。

    const issue_return_details = (req, res) => {
        var perPage = 3;
        var page = req.params.page || 1;
        IssueBack.find()
        .skip((perPage * page) - perPage)
        .limit(perPage)
        .populate([
      {
        "path": "issue",
        "populate": [
          {
            "path": "employee"
          },
          {
            "path": "product",
            "populate": { "path": "category" }
          }
        ]
      }
    ]).then((issueback) => {
          IssueBack.count().then((count) => {
            res.render("products/issue/returnDetails", {
              user: req.user,
              issueback: issueback,
              current : page,
              pages : Math.ceil(count / perPage),
              message: req.flash("success_msg"),
            });
          })
        })
        .catch((err) => {
          console.log(err);
        });
    };
    

    【讨论】:

    • 乐于助人!
    猜你喜欢
    • 2018-11-23
    • 2015-09-15
    • 2016-12-22
    • 2019-12-01
    • 2014-03-31
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多