如何在对象数组的MongoDB中用日期类型替换字符串类型?

时间:2018-07-19 13:02:55

标签: mongodb

我知道转换第一级日期的方法

db.collection.find().forEach(function(x){ 
x.DateField = ISODate(x.DateField); 
db.collection.save(x);})

这适用于第一级字段,但是如果我想更改以下json示例中的数组CreatedTime中的对象的字段,该怎么办:

{
    "Pharmacy": "b",
    "Medicine": [
      {
        "MedName": "MedB",
        "Quantity": 60,
        "CreatedTime" : "2006-05-05T11:44:47.86Z"
      },
      {
        "MedName": "MedC",
        "Quantity": 34,
        "CreatedTime" : "2006-11-23T12:28:44.86Z"
      }
    ]
}

2 个答案:

答案 0 :(得分:1)

db.getCollection('test').find({}).forEach(function(doc) {
    doc.Medicine.forEach(function(doc1){
        var dbl = new Date(doc1.CreatedTime);
        doc1.CreatedTime = dbl;
    });
    db.test.save(doc);
});

已编辑:======= 第二种方法:Source

db.logmessages.aggregate( [ {
    $project: {
       date: {
          $dateFromString: {
             dateString: '$date',
             timezone: 'America/New_York'
          }
       }
    }
} ] )

答案 1 :(得分:1)

您可以使用汇总查询和批量更新中的光标来更新4.0版本的文档。

$map$toDate结合使用以保留现有值并将字符串date转换为日期类型。

这是外壳样本。

var bulk = db.collection.initializeUnorderedBulkOp();
var count = 0;
var batch = 50; // Change batch size as you need

db.collection.aggregate([
  {"$project":{
       "Medicine":{
         "$map":{
            "input":"$Medicine",
            "in":{
                "MedName":"$$this.MedName",                                  
                "Quantity":"$$this.Quantity",
                "CreatedTime":{"$toDate":"$$this.CreatedTime"}
            }
          }
       }
   }}
]).forEach(function(doc){ 
    bulk.find( {"_id" : doc._id}).updateOne(
     { "$set": {"Medicine" : doc.Medicine}} 
   ); 
    count++;  
    if (count == batch) { 
        bulk.execute(); 
        bulk = db.collection.initializeUnorderedBulkOp(); 
        count = 0;
    } 
});

if (count > 0) { 
   bulk.execute(); 
}