Javascript 编辑仅存在于某些文档中的内部数组
我在mongo中有一个JSON条目: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
{
_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
上将字段类型从字符串更改为日期。如果为真,则需要更改这些代码。以上仅根据原始代码更改第一个元素