假设我有一个
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 中是如何完成的?
只需编写一个 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
我遇到了同样的问题,很高兴这对我有帮助。谢谢!
db.collection.updateMany()