使用 Mongoose 是否有一种有效的方法来更新模型并将新的 key/values 添加到以前保存的文档中?
With Mongoose is there an efficient way to update the Model and add new key/values to previously saved documents?
问题:一旦在 Mongoose 中创建了模型,是否有办法更新模型并将新的key/values添加到之前保存的文档中?
在下面的示例中,包含 dataName、data1、data2、data3 的文档存储在数据库中。后来我更新了模型以包含 data4 和 data5。所有新文档都使用附加密钥存储。然而,旧文档不会自动获得空的 data4 和 data5。除了手动操作之外,我如何将这些密钥添加到以前保存的文档中?
"use strict";
const bodyParser = require('body-parser');
const express = require('express');
const mongoose = require('mongoose');
const path = require('path');
const app = express();
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));
const urlEncoded = bodyParser.urlencoded({ extended: true });
const WillThisExpandSchema = new mongoose.Schema({
dataName: {
type: String,
required: true
},
data1: {
type: String,
required: true
},
data2: {
type: String,
required: true
},
data3: {
type: String,
required: true
}
});
const WillThisExpand = mongoose.model('willThisExpand', WillThisExpandSchema);
app.get('/', (req, res)=> {
res.render('index');
});
app.post('/upload', urlEncoded, async (req, res) => {
let { dataName, data1, data2, data3 } = req.body;
let newItem = new WillThisExpand({
dataName, data1, data2, data3
})
await newItem.save();
res.redirect('/');
});
let mongooseConnection = 'mongodb+srv://administrator:<password>@websites.tolyc.mongodb.net/mongooseTest?retryWrites=true&w=majority';
mongoose
.connect(mongooseConnection, { autoIndex: false, useCreateIndex: true, useNewUrlParser: true, useUnifiedTopology: true, useFindAndModify: false })
.then(function () {
console.log('mongoose connected');
})
.catch(function (error) {
logErrorMessage(error);
});
app.listen(8080, () => {
console.log('app listening on port 8080');
})
可能有更好的方法来做到这一点,但我想出了一个简单的方法。
- 更新架构以反映新键。
- 创建一条使用
.updateMany()
的路线。包括匹配每个文档的正则表达式。 /(.*?)/g
- 浏览器点击路由,keys被添加
- 删除路线。
例如,
app.get('/update', async (req, res) => {
await WillThisExpand.updateMany({ dataName: /(.*?)/g }, { data4: '', data5: '' });
res.redirect('/');
});
我对此进行了测试,它似乎运行良好。我可以通过新添加的键进行搜索,当我添加值时,它们无误地返回并且可用。
问题:一旦在 Mongoose 中创建了模型,是否有办法更新模型并将新的key/values添加到之前保存的文档中?
在下面的示例中,包含 dataName、data1、data2、data3 的文档存储在数据库中。后来我更新了模型以包含 data4 和 data5。所有新文档都使用附加密钥存储。然而,旧文档不会自动获得空的 data4 和 data5。除了手动操作之外,我如何将这些密钥添加到以前保存的文档中?
"use strict";
const bodyParser = require('body-parser');
const express = require('express');
const mongoose = require('mongoose');
const path = require('path');
const app = express();
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));
const urlEncoded = bodyParser.urlencoded({ extended: true });
const WillThisExpandSchema = new mongoose.Schema({
dataName: {
type: String,
required: true
},
data1: {
type: String,
required: true
},
data2: {
type: String,
required: true
},
data3: {
type: String,
required: true
}
});
const WillThisExpand = mongoose.model('willThisExpand', WillThisExpandSchema);
app.get('/', (req, res)=> {
res.render('index');
});
app.post('/upload', urlEncoded, async (req, res) => {
let { dataName, data1, data2, data3 } = req.body;
let newItem = new WillThisExpand({
dataName, data1, data2, data3
})
await newItem.save();
res.redirect('/');
});
let mongooseConnection = 'mongodb+srv://administrator:<password>@websites.tolyc.mongodb.net/mongooseTest?retryWrites=true&w=majority';
mongoose
.connect(mongooseConnection, { autoIndex: false, useCreateIndex: true, useNewUrlParser: true, useUnifiedTopology: true, useFindAndModify: false })
.then(function () {
console.log('mongoose connected');
})
.catch(function (error) {
logErrorMessage(error);
});
app.listen(8080, () => {
console.log('app listening on port 8080');
})
可能有更好的方法来做到这一点,但我想出了一个简单的方法。
- 更新架构以反映新键。
- 创建一条使用
.updateMany()
的路线。包括匹配每个文档的正则表达式。/(.*?)/g
- 浏览器点击路由,keys被添加
- 删除路线。
例如,
app.get('/update', async (req, res) => {
await WillThisExpand.updateMany({ dataName: /(.*?)/g }, { data4: '', data5: '' });
res.redirect('/');
});
我对此进行了测试,它似乎运行良好。我可以通过新添加的键进行搜索,当我添加值时,它们无误地返回并且可用。