MongoDB:更新所有文档中的字符串字段

时间:2016-09-26 01:36:33

标签: javascript node.js mongodb database

我有一个MongoDB数据库,其中包含许多文档。每篇文章都有一个名为myField的字段,其中包含一个字符串。

我是否可以对集合中的所有文档运行批量更新,修改每个文档的myField值?

在我的情况下,我只想从每个字段中删除一个尾随的“.html”。我正在使用node.js在我的应用程序中与Mongo进行交互,但我希望能够在mongo命令提示符下运行单个命令来执行此更新(如果可能的话)。

2 个答案:

答案 0 :(得分:3)

是否可以使用if (inbox.isOpen()) { Message[] messages = inbox.getMessages(); for (int i = 0; i < messages.length; i++) { System.out.println( messages[i]); messages[i].setFlag(Flags.Flag.DELETED, true); } if (inbox.isOpen()) { inbox.expunge(); } } 从命令提示符更新 mongoDB 文档信息。

说出脚本文件名mongo并转到此文件目录并打开命令提示符并运行此命令。

migration.js

mongo localhost/dbName migration.js 代码如:

migration.js

答案 1 :(得分:1)

考虑使用 bulkWrite API来利用更新,因为它比在循环中执行更新更好,更有效,即每次迭代发送每个更新请求可能会很慢使用大型数据集。

bulkWrite API会将批量写入服务器的500次发送给服务器,因为您不会向服务器发送每个请求,只需每500次一次请求。

对于批量操作,MongoDB每批执行default internal limit of 1000个操作,因此从一定程度上可以控制批量大小而不是让MongoDB强制使用默认值,即可选择500个文档。 <幅度>的操作1000份文件。

采用以下示例:

var bulkUpdateOps = [], // create an array to hold the update operations
    counter = 0, // counter to control the batch sizes
    rgx = /\.(html)$/i, // regex for querying and updating the field
    cursor = db.collection.find({ "myField": rgx }); // cursor for iterating

cursor.snapshot().forEach(function(doc) {
    var updatedField = doc.myField.replace(rgx, ''); // update field
    bulkUpdateOps.push({ // queue the update operations to an array
        "updateOne": {
            "filter": { 
                "_id": doc._id, 
                "myField": { "$ne": updatedField } 
            },
            "update": { "$set": { "myField": updatedField } }
        }
    });
    counter++;

    if (counter % 500 == 0) { // send the update ops in bulk
        db.collection.bulkWrite(bulkUpdateOps);
        bulkUpdateOps = []; // reset the array
    }
})

if (counter % 500 != 0) { // clean up remaining operations in the queue
    db.collection.bulkWrite(bulkUpdateOps)
}