循环浏览Mongo Collection并更新每个文档中的字段

时间:2015-11-04 19:25:47

标签: node.js mongodb mongodb-query

我在一个集合中的日期插入不正确,并且采用简单的"2015-09-10" 字符串格式。

我想更新它们以更正 ISO日期格式

我尝试使用forEach()循环遍历Mongo,但我不太清楚shell如何更新集合中的每个文档。

到目前为止,我正处于这一点:

db.getCollection('schedules').find({}).forEach(function (doc) {

    doc.time = new Date( doc.time ).toUTCString();

    printjson( doc.time );
    // ^ This just prints "Invalid Date"

    // Also none of the below work when I try saving them

    //doc.save();
    //db.getCollection('schedules').save(doc);
});

这里缺少什么?

2 个答案:

答案 0 :(得分:6)

执行此操作的最佳方法是使用"Bulk"操作

var collection = db.getCollection('schedules');
var bulkOp = collection.initializeOrderedBulkOp();
var count = 0;
collection.find().forEach(function(doc) {
    bulkOp.find({ '_id': doc._id }).updateOne({
        '$set': { 'time': new Date(doc.time) }
    });
    count++;
    if(count % 100 === 0) {
        // Execute per 100 operations and re-init
        bulkOp.execute();
        bulkOp = collection.initializeOrderedBulkOp();
    }
});

// Clean up queues
if(count > 0) {
    bulkOp.execute();
}

答案 1 :(得分:-1)

只需使用 .find() 编写一个 for 循环,并更新每个结果。例如,在 Python/PyMongo 中,假设我们有一个名为 'movies' 的集合,我们希望通过添加一个名为 'reviews' 的字段来更新它,我们希望该字段的值是一个包含 'name' 和 'rating 的五个对象的数组' 字段。我们将使用 Faker 和 random 为这些字段创建一些随机信息:

from pymongo import MongoClient 
from faker import Faker 
faker = Faker()
import random

client = MongoClient()
db = client.test

for res in db.movies.find():
    db.movies.updata_one(res, {'$set':{'reviews':[{'name':faker.name(), 'rating': random.randint(1,5)} for _ in range(5)]}})

请注意,如果您使用的是原生 Mongo,那么您应该使用 updateOne 而不是 update_one。我认为类似的方法适用于 JavaScript,只是使用 for (let res of db.movi​​es.find()) 语法