如何在 mongoose nodejs 和 ejs 中填充多个集合
How to populate multiple collections in mongoose nodejs and ejs
上下文:所以我正在尝试使用 ejs nodejs express 和 mongoose 制作一个产品管理系统,用户可以在其中向特定员工发布产品,然后也可以 returned。我遇到的问题是我无法在 returning 产品后立即将产品和员工集合填充到 ejs 文件中。我已经尝试了很多搜索,但无法找到解决方案。
这是return控制器的代码
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>
Return 型号(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;
提前致谢。
试试这个。你必须嵌套你的填充对象。
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);
});
};
上下文:所以我正在尝试使用 ejs nodejs express 和 mongoose 制作一个产品管理系统,用户可以在其中向特定员工发布产品,然后也可以 returned。我遇到的问题是我无法在 returning 产品后立即将产品和员工集合填充到 ejs 文件中。我已经尝试了很多搜索,但无法找到解决方案。
这是return控制器的代码
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>
Return 型号(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;
提前致谢。
试试这个。你必须嵌套你的填充对象。
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);
});
};