向架构添加新字段后如何更新旧文档?

问题描述 投票:0回答:2

假设我有一个

user
模式,如下所示:

const userSchema = new mongoose.Schema({
    username: {
        type: String,
        required: true,
    },
    password: {
        type: String,
        required: true
    }
});

然后一些人在网站上注册并创建了

user
文档。

然后在未来的某个时刻,我将这些附加字段添加到

user
模式中:


    joinedAt: {
        type: Data,
        default: Date.now,
    },
    about: {
        type: String,
        required: true,
    }

如何更新旧数据?我来自

django
,在
django
中,我只需运行
python3 manage.py makemigrations
,如果不需要或有默认值,它会将更改应用于所有现有数据(如本例中的
joinedAt
)。

但如果没有(如本例中的

about
字段),那么它会问我现有字段的值应该是多少。

Node.js 中是如何完成的?

node.js mongoose nosql sql-update mongoose-schema
2个回答
2
投票

只需编写一个 MongoDb 更新查询,如下所示:

let about = "Whatever you want";

db.users.updateMany(
    {
        joinedAt: { $exists: false },
        about: { $exists: false },
    },
    {
        $set: {
            joinedAt: new Date(),
            about: about
        }
    }
);

如果您想要 Node.js 脚本,那么:

第 1 步:创建文件

user_migration.js

const MongoClient = require('mongodb').MongoClient;
const DB_URI = "mongodb://localhost:27017/myDB";

const options = {
  useNewUrlParser: true
};

MongoClient.connect(DB_URI, options, (err, client) => {
  if (err) {
    console.log("ERROR: Failed to connect to database.");
    console.log(err);
    return;
  }

  let dbName = DB_URI.split("/", -1).pop();
  let db = client.db(dbName);

  console.log(`Connected to ${dbName} database successfully.`);

  let about = "Whatever you want";
  db
    .collection('users')
    .updateMany(
      {
        joinedAt: { $exists: false },
        about: { $exists: false },
      },
      {
        $set: {
          joinedAt: new Date(),
          about: about
        }
      }
    )
    .then(res => {
      // console.log(res);
      console.log(`${res.result.nModified} documents updated successfully.`);
      console.log("Database connection closed.");
      client.close();
    })
    .catch(err => {
      console.log(JSON.stringify(err));
      console.log("Database connection closed.");
      client.close();
    });
});

第 2 步:从终端运行文件:

node C:path\to\your\source_code\user_migration.js

0
投票

我遇到了同样的问题,很高兴这对我有帮助。谢谢!

db.collection.updateMany()

文档: https://www.mongodb.com/docs/manual/reference/method/db.collection.updateMany/#std-label-update-many-method-update-document

© www.soinside.com 2019 - 2024. All rights reserved.