您好,我正在寻找一种方法,可以使用node.js和express从服务器端向现有的mongoDB文档中动态插入新字段。
例如,在本地mongoDB中,文档如下所示。
{
value: 'Google',
url: 'https://google.com',
env: 'Test'
}
我有一条路线已经可以从UI上的表单更新当前文档字段。但是我想将这种逻辑与在更新时插入新字段的能力结合起来。
下面的路线用于使用现有字段更新文档。
router.put("/:id", (req, res) => {
let value = req.body.value;
Application.findByIdAndUpdate(req.params.id, req.body.application, (err,
updatedApp) => {
if(err){
console.log(err);
} else {
console.log(updatedApp)
req.flash("info", updatedApp.value + " " + "successfully edited!");
res.redirect("/qa-hub/applicationmanager");
}
});
});
在前端,我使用带有表格的EJS来更新文档。下面的示例:
<div class="row">
<div class="col-md-6">
<div class="form-group">
<input class="form-control" type="url" name="application[url]" value="<%= application.url %>" required>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="form-group">
<select class="form-control" name="application[env]" required="true">
<option class="text-center" value='<%= application.env %>'><%= application.env %></option>
<option value='Beta'>Beta</option>
<option value='Dev'>Dev</option>
<option value='Does Not Apply'>Does Not Apply</option>
<option value='Prod'>Prod</option>
<option value='QA'>QA</option>
<option value="Test">Test</option>
</select>
</div>
</div>
</div>
<div class="row">
<div class="col-md-4">
<div class="form-group">
<a class="btn btn-outline-warning" href="/qa-hub/applicationmanager">Cancel</a>
</div>
<div class="form-group">
<button class="btn btn-outline-primary" id="btn" >Update</button>
但是,我想在提交表单时添加三个附加字段。我想捕获执行该编辑操作的当前登录用户以及日期和时间。我已经解决了这个问题,但是如何实现将新数据从route.put插入到现有文档中,同时又保持逻辑以在进行任何更改时更新当前字段。
因此,在用户进行了一些更改并更新了三个字段之后,文档将如下所示,除了id处理逻辑以获取当时的当前登录用户和日期/时间并将其传递给用户之外,下面的示例将对其进行硬编码。
{
value: 'Google',
url: 'https://google.com',
env: 'Test',
updatedBy: "Test User"
timeUpdated: "12:54",
dateUpdated: "7/25/2018"
}
所以最终我想保留更改日志,而不是将其添加到UI。
答案 0 :(得分:0)
因此,在这篇帖子TypeError: callback.apply is not a function (Node.js & Mongodb)的帮助下,我能够使用$ set将新字段附加到现有文档中。但是,当尝试在$ set之前执行req.body.application时,将引发错误,指出callback.apply不是函数。因此,如果您要在设置新字段后更新文档,我就创建了一个回调。我知道它很凌乱,但是只是想让它正常工作,可以随意使用并自行清理代码。
router.put("/:id", (req, res) => {
let value = req.body.value;
let value = req.body.value;
let date = new Date();
let hour = date.getHours();
hour = (hour < 10 ? "0" : "") + hour;
let min = date.getMinutes();
min = (min < 10 ? "0" : "") + min;
let time = hour+":"+min;
let year = date.getFullYear();
let month = date.getMonth() + 1;
month = (month < 10 ? "0" : "") + month;
let day = date.getDate();
day = (day < 10 ? "0" : "") + day;
today = month+"/"+day+"/"+year;
let updatedTo = month+"/"+day+"/"+year;
let updatedT = hour+":"+min;
let updatedBy = req.user.username;
//Find the document based on it's ID and than append these three new fields
Application.findByIdAndUpdate(req.params.id,
{ $set: {
updatedTime: `${updatedT}`,
updatedToday: `${updatedTo}`,
updatedBy: `${updatedBy}`
}}, { upsert: true },
(err,updatedApp) => {
if(err){
return handleError(err);
} else {
// Than if any changes were made from the UI we apply those updates taken
// from the form with req.body.application
Application.findByIdAndUpdate(req.params.id, req.body.application,
(err, updatedApp) => {
if(err){
return handleError(err);
} else {
console.log(updatedApp)
req.flash("info", updatedApp.value + " " + "successfully edited!");
res.redirect("/qa-hub/applicationmanager");
}
}
});
});