2014-09-18 40 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。如果屬實,則需要更改這些代碼。以上僅根據您的原始代碼更改第一個元素。