Javascript 编辑仅存在于某些文档中的内部数组

Javascript 编辑仅存在于某些文档中的内部数组,javascript,mongodb,Javascript,Mongodb,我在mongo中有一个JSON条目: { _id:“fe50fdee-4ea3-4824-94af-f369633c0c7a”, _类:“com.tracking.daoservice.model.TrackingData”, 修改:ISODate(“2014-09-10T23:38:48.407Z”), 事件类型:“威廉测试”, 事件数据:{ QueryDate:“2014年4月1日”, 搜索查询:{ 关键词:“Java”, 地点:“加利福尼亚州圣克拉拉”, 方面:“skill~java~pe

我在mongo中有一个JSON条目:

{
_id:“fe50fdee-4ea3-4824-94af-f369633c0c7a”,
_类:“com.tracking.daoservice.model.TrackingData”,
修改:ISODate(“2014-09-10T23:38:48.407Z”),
事件类型:“威廉测试”,
事件数据:{
QueryDate:“2014年4月1日”,
搜索查询:{
关键词:“Java”,
地点:“加利福尼亚州圣克拉拉”,
方面:“skill~java~perl | workAuth~USC”,
SearchAgentId:“4299”
},
查看:[
{
ViewedID:“8992ade400a”,
Dockey:“3323ABA323”,
PID:“32399a”,
actionsTaken:“电子邮件|直接消息|报告寻求者”,
查看日期:“2014年4月1日”,
MessageSent:“真”,
信息:[
{
MessageID:“123aca323”,
交付:“真实”,
打开:“正确”,
点击链接:“不错”,
消息日期:“2014年4月2日”,
答复:[
{
回应:“a323a9da”,
答复日期:“2014年4月23日”
}
]
}
]
}
]
},
eventsource:“API开发测试-JMachine”,
sourceip:“myIp”,
entityid:“tMoneyBunnyWnny”,
groupid:“骰子”,
创建日期:ISODate(“2014-09-10T23:38:48.405Z”)
}
我有一个脚本来更改内部日期属性

db.TRACKING_DATA.find().forEach(函数(doc){
db.TRACKING_DATA.update({
“_id”:文件编号,
“eventdata.Viewed.viewDate”:doc.eventdata.Viewed[0]。viewDate
}, { 
“$set”:{“eventdata.Viewed.$.Message.0.MessageDate”:新日期(doc.eventdata.Viewed[0]。Message[0]。MessageDate)}
} 
) 
});
问题在于并非所有文档都包含内部对象:

消息:[
{
MessageID:“123aca323”,
交付:“真实”,
打开:“正确”,
点击链接:“不错”,
消息日期:“2014年4月2日”,
答复:[
{
回应:“a323a9da”,
答复日期:“2014年4月23日”
}
]
}
]
因此,当我运行它时,它会返回:

TypeError:无法读取未定义的属性“0”
我需要一种方式来基本上说:

if(消息存在,请更改其中的这些条目)
我尝试了以下几种变体:

db.TRACKING_DATA.find().forEach(函数(doc){
db.TRACKING_DATA.update(
{ 
“_id”:文件编号,
“eventdata.Viewed.viewDate”:doc.eventdata.Viewed[0]。viewDate,doc.eventdata.Viewed[0]。消息[0]:{$exists}
}, 
{ 
“$set”:{“eventdata.Viewed.$.Message.0.MessageDate”:新日期(doc.eventdata.Viewed[0]。Message[0]。MessageDate)}
} 
)
});
但无法找到可行的解决方案


干杯,

添加一些判断会有所帮助

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)
                    }
                });
            }
        }
    });
我猜您希望在
消息的每个
MessageDate
上将字段类型从字符串更改为日期。如果为真,则需要更改这些代码。以上仅根据原始代码更改第一个元素