MongoDB:使用当前字段值更新文档

时间:2016-08-10 11:59:12

标签: mongodb

我有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);

2 个答案:

答案 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); 
    }   
});