以字符串格式更新mongo日期

时间:2019-11-05 11:51:47

标签: mongodb

我有一个收藏有2000万个文档的收藏集。 我想更新一个字段,该字段是表示此日期的字符串,格式为->“ timestamp”:“ 2019/10/03 05:24:45.000” 我想在符合特定条件的每一行中增加30天。

我已经完成了,但是表现却很差,我认为有更好的方法来做到这一点。

示例文档:

{ 
    "_id" : ObjectId("5d962843525def14360ca35b"), 
    "sensor" : "sensor_87.202:h", 
    "timestamp" : "2019/10/03 05:24:45.000", 
    "value" : 5.0, 
    "samplingFrequency" : NumberLong(15)
}

这是我的方法:

var bulk = db.Measure.initializeUnorderedBulkOp(),
count = 0;
db.getCollection('Measure').aggregate([
    {$match:{sensor:'sensor_88.11:h',timestamp : {'$gt': '2019/09/02 11:40:00.000', '$lt': '2019/10/02 11:41:00.000'}}},
    {$project:{sensor:1,timestamp:  {$dateToString: { format: '%Y/%m/%d %H:%M:%S.%L', date: {$add: [{$dateFromString: { dateString: '$timestamp'}},1000 * 3600 * 24 * 30]} } }}}
])
.forEach(function(x){ 
    bulk.find({'_id':x._id}).updateOne({$set:{'timestamp':x.timestamp}});
    count++;
    if ( count % 1000 == 0 ) {
        bulk.execute();
        bulk = db.Measure.initializeUnorderedBulkOp();
    }
});
print(count);    
if ( count % 1000 !=0 ){
    bulk.execute();
}    

match和project阶段返回大约76k文档,这些文档必须在forEach中进行更新。 ¿有没有办法对所有匹配的文档进行无循环处理?

请注意,如果我将函数的内容替换为简单的print(“ test”);表现很好。所以我认为问题出在更新上。

0 个答案:

没有答案