我有一个MongoDB数据库,其中包含许多文档。每篇文章都有一个名为myField
的字段,其中包含一个字符串。
我是否可以对集合中的所有文档运行批量更新,修改每个文档的myField
值?
在我的情况下,我只想从每个字段中删除一个尾随的“.html”。我正在使用node.js在我的应用程序中与Mongo进行交互,但我希望能够在mongo
命令提示符下运行单个命令来执行此更新(如果可能的话)。
答案 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)
}