2014-09-18 43 views
0

我有蒙戈内的JSON条目:编辑内阵列,其仅呈现一些文档

{ 
_id: "fe50fdee-4ea3-4824-94af-f369633c0c7a", 
_class: "com.tracking.daoservice.model.TrackingData", 
modified: ISODate("2014-09-10T23:38:48.407Z"), 
eventtype: "William-Test", 
eventdata: { 
    QueryDate: "01-APR-2014", 
    SearchQuery: { 
     keyword: "Java", 
     location: "Santa Clara, CA", 
     Facet: "skill~java~perl|workAuth~USC", 
     SearchAgentId: "4299" 
    }, 
    Viewed: [ 
     { 
      ViewedID: "8992ade400a", 
      Dockey: "3323aba3233", 
      PID: "32399a", 
      actionsTaken: "email|direct message|report seeker", 
      viewDate: "01-APR-2014", 
      MessageSent: "true", 
      Message: [ 
       { 
        MessageID: "123aca323", 
        Delivered: "True", 
        Opened: "True", 
        ClickThroughRate: "NotBad", 
        MessageDate: "02-APR-2014", 
        Response: [ 
         { 
          ResponseId: "a323a9da", 
          ResponseDate: "23-APR-2014" 
         } 
        ] 
       } 
      ] 
     } 
    ] 
}, 
eventsource: "API-Dev Test - JMachine", 
sourceip: "myIp", 
entityid: "TmoneyBunnyWunny", 
groupid: "Dice", 
datecreated: ISODate("2014-09-10T23:38:48.405Z") 
} 

我有一个脚本以改变内日期属性,

db.TRACKING_DATA.find().forEach(function(doc) { 
    db.TRACKING_DATA.update({ 
    "_id": doc._id, 
    "eventdata.Viewed.viewDate":doc.eventdata.Viewed[0].viewDate 
    }, { 
    "$set": { "eventdata.Viewed.$.Message.0.MessageDate": new Date(doc.eventdata.Viewed[0].Message[0].MessageDate) } 
    } 
) 
}); 

问题并非所有的文档都包含内部对象:

Message: [ 
       { 
        MessageID: "123aca323", 
        Delivered: "True", 
        Opened: "True", 
        ClickThroughRate: "NotBad", 
        MessageDate: "02-APR-2014", 
        Response: [ 
         { 
          ResponseId: "a323a9da", 
          ResponseDate: "23-APR-2014" 
         } 
        ] 
       } 
      ] 

所以当我运行它时,它ret瓮:

TypeError: Cannot read property '0' of undefined 

我需要一种方法来基本上说:

if(Message exists change these entries within it) 

我已经尝试了许多变化:

db.TRACKING_DATA.find().forEach(function(doc) { 
    db.TRACKING_DATA.update(
    { 
    "_id": doc._id, 
    "eventdata.Viewed.viewDate":doc.eventdata.Viewed[0].viewDate, doc.eventdata.Viewed[0].Message[0]: {$exists} 
    }, 
    { 
    "$set": {"eventdata.Viewed.$.Message.0.MessageDate": new Date(doc.eventdata.Viewed[0].Message[0].MessageDate) } 
    } 
) 
}); 

,但无法找到一个可行的解决方案。

干杯,

回答

1

添加一些判断将有所帮助。

db.TRACKING_DATA.find().forEach(
    function(doc) { 
     var Viewed = doc.eventdata.Viewed; 
     if (Viewed instanceof Array && Viewed[0]) { 
      var Message = Viewed[0].Message; 
      if (Message instanceof Array && Message[0]) { 

       db.TRACKING_DATA.update({ 
        "_id" : doc._id, 
        "eventdata.Viewed.viewDate" : Viewed[0].viewDate 
       }, { 
        "$set" : { 
         "eventdata.Viewed.$.Message.0.MessageDate" : new Date(Message[0].MessageDate) 
        } 
       }); 
      } 
     } 
    }); 

我猜你想从字符串更改字段类型为日期上MessageMessageDate。如果属实,则需要更改这些代码。以上仅根据您的原始代码更改第一个元素。