我在一个集合中的日期插入不正确,并且采用简单的"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);
});
这里缺少什么?
答案 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.movies.find()) 语法