我有mongodb" Mydb"与收集"用户"。
export let User = mongoose.model("User", UserSchema);
let UserSchema = new mongoose.Schema({
phone : {
type : String,
validate: {
现在我想更新字段"电话"替换空格(例如)。我尝试使用以下内容:
User.update({}, {$set : {'phone': //here is my problem}},
{multi: true, upsert:false}, () => next());
我怎样才能获得最新的电话"价值取代它? (我使用mongoose-migrate)
正如我所说,我尝试使用mongoose-migration模块,所以我创建了这样的新迁移文件:
'use strict'
const mongoose = require('mongoose');
import { User, dbConnection } from '../db/index'
export function up(next) {
User.update({}, {$set : {'phone': this.phone}}, {multi: true, upsert:false}, () => next());
}
export function down(next) {
next();
}
用户:
export let User = mongoose.model("User", UserSchema);
答案 0 :(得分:0)
如果您尝试使用Schema.Methods
。
使用this.phone
访问该文档的phone
字段。
User.update({}, {$set : {'phone': this.phone}},
{multi: true, upsert:false}, () => next());
//using this.phone, access phone variable and change to whatever you need to set in update process.
答案 1 :(得分:0)
要更新Mongoose集合中所有文档的电话字段,请使用 Bulk()
API,该API可提供有效的更新,尤其是在您更新使用循环更新的大型集合时每个文档都有性能缺陷。
要使用基础批量操作API,您应该通过mongoose模型的.collection
属性访问它。在使用API之前,请等待mongoose成功连接到数据库,因为Mongoose目前不支持 "initializeOrderedBulkOp()"
功能,因为它不适用于mongoose的内部缓冲系统。
以下示例适用于MongoDB >= 2.6 and < 3.2
,因为版本3.2中不推荐支持 Bulk()
操作:
mongoose.connection.on("open", (err) => {
if (err) throw err;
let bulkUpdateOps = User.collection.initializeUnorderedBulkOp();
let counter = 0;
User.find({}).lean().exec((err, users) => {
if (err) throw err;
users.forEach((user) => {
// computations
let newPhone = user.phone.replace(/\s/g, '');
counter++;
bulkUpdateOps.find({ "_id": user._id }).updateOne({
"$set": { "phone": newPhone }
});
if (counter % 500 == 0 ) {
bulkUpdateOps.execute((err, result) => {
if (err) throw err;
bulkUpdateOps = User.collection.initializeUnorderedBulkOp();
console.log(result);
});
}
});
if (counter % 500 != 0 ) {
bulkUpdateOps.execute((err, result) => {
if (err) throw err;
console.log(result);
});
}
});
})
对于支持>=4.3.0
的Mongoose版本MongoDB Server 3.2.x
,
您可以使用 bulkWrite()
进行更新。以下示例说明了如何解决此问题:
User.find({}).lean().exec((err, users) => {
if (err) throw err;
let bulkUpdateCallback = (err, r) => {
console.log(r.matchedCount);
console.log(r.modifiedCount);
};
let bulkUpdateOps = [];
// Initialise the bulk operations array
users.forEach((doc) => {
let newPhone = user.phone.replace(/\s/g, '');
bulkUpdateOps.push({
"updateOne": {
"filter": { "_id": user._id },
"update": { "$set": newPhone }
}
});
if (bulkUpdateOps.length == 1000) {
User.collection.bulkWrite(bulkUpdateOps, bulkUpdateCallback);
bulkUpdateOps = [];
}
});
if (bulkUpdateOps.length > 0) {
User.collection.bulkWrite(bulkUpdateOps, bulkUpdateCallback);
}
});