使用 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');
})

可能有更好的方法来做到这一点,但我想出了一个简单的方法。

  1. 更新架构以反映新键。
  2. 创建一条使用 .updateMany() 的路线。包括匹配每个文档的正则表达式。 /(.*?)/g
  3. 浏览器点击路由,keys被添加
  4. 删除路线。

例如,

app.get('/update', async (req, res) => {

    await WillThisExpand.updateMany({ dataName: /(.*?)/g }, { data4: '', data5: '' });

    res.redirect('/');

});

我对此进行了测试,它似乎运行良好。我可以通过新添加的键进行搜索,当我添加值时,它们无误地返回并且可用。