Javascript 无法使用upsert删除键

Javascript 无法使用upsert删除键,javascript,mongoose,Javascript,Mongoose,收到客户的数据后,我想添加一个新文档或更新(如果已经存在)。对于所有未定义的参数,我想删除现有的键 处理数据并执行保存/更新数据的功能如下: router.post('/saveEvent', isAuthenticated, function(req, res){ var eventId = req.body.eventId; console.log(eventId); var timelineId = req.body.timelineId; var strE

收到客户的数据后,我想添加一个新文档或更新(如果已经存在)。对于所有未定义的参数,我想删除现有的键

处理数据并执行保存/更新数据的功能如下:

router.post('/saveEvent', isAuthenticated, function(req, res){
    var eventId = req.body.eventId;
    console.log(eventId);
    var timelineId = req.body.timelineId;
    var strEventStart = req.body.eventStart;
    var strEventEnd = req.body.eventEnd;
    var mediaURI = req.body.mediaURI;
    var note = req.body.note;
    var title = req.body.title;
    var eventIdToSave;

    var event = new Event({_timeline: timelineId, title: title, description: note, mediaURI: mediaURI, eventStart: strEventStart, eventEnd: strEventEnd});

    console.log("Updated event: " + event);

    if(!(eventId == "" | eventId == undefined)){
        eventIdToSave = eventId;
    } else {
        eventIdToSave = event._id;
    }
    var upsertData = event.toObject();
    delete upsertData._id;
    console.log("event: " + upsertData);

    Event.update({_id: eventIdToSave}, upsertData, {upsert: true}, function(err){
        if(err){
            console.log(err);
        } else{
            if(eventId == "" | eventId == undefined){
                Timeline.findByIdAndUpdate(
                    timelineId,
                    {$push: {"events": eventIdToSave}},
                    {safe: true, upsert: true, new : true},
                    function(err, model) {
                        console.log(err);
                        if(!err){
                            console.log("added new event to timeline");
                            res.json({Successful: true});
                        }
                    }
                );
            } else {
                res.json({Successful: true});
            }
        }
    });
});
下面是接收数据的控制台输出示例:

Updated event: { _timeline: 55b21588c4a50f345c928e2c,
  title: 'This is perfect!',
  description: '<div><b style="line-height: 1.42857143;">This image was taken somewhere in Europe.</b><br></div>',
  mediaURI: undefined,
  eventStart: Thu Jul 30 2015 23:26:00 GMT+0200 (CEST),
  eventEnd: undefined,
  _id: 55b24aff323dc6dd6d7378ea,
  duration: false }
更新事件:{时间线:55b21588c4a50f345c928e2c,
标题:“这太完美了!”,
描述:“这张照片是在欧洲某地拍摄的。
”, mediaURI:未定义, 活动开始时间:2015年7月30日星期四23:26:00 GMT+0200(CEST), eventEnd:未定义, _id:55b24aff323dc6dd6d7378ea, 持续时间:false}
在本例中,mediaURI和eventEnd未定义,但键未被删除;以下是在执行上述操作后从采集中检索到的数据示例:

events: 
   [ { _id: 55b23d265821141f65bb515d,
       mediaURI: 'https://dl.dropboxusercontent.com/1/view/xxxxx.jpg',
       description: '<div><b style="line-height: 1.42857143;">This image was taken somewhere in Europe.</b><br></div>',
       title: 'This is perfect!' } ] }
事件:
[{u id:55b23d265821141f65bb515d,
mediaURI:'https://dl.dropboxusercontent.com/1/view/xxxxx.jpg',
描述:“这张照片是在欧洲某地拍摄的。
”, 标题:“这太完美了!”}]}
有人知道删除现有文档中未从客户端接收参数的所有密钥的正确方法吗


我已经检查过了,不知道为什么没有删除带有未定义值的键。

也许可以试试这个,如果你有

var upsertData = event.toObject();
delete upsertData._id;
将此添加到下面

for (var theKey in upsertData) {
  if (upsertData.hasOwnProperty(theKey)) {
    if (!upsertData[theKey]) {
      delete upsertData[theKey];
    }
  }
}

还是我遗漏了什么?

也许试试这个,在你有

var upsertData = event.toObject();
delete upsertData._id;
将此添加到下面

for (var theKey in upsertData) {
  if (upsertData.hasOwnProperty(theKey)) {
    if (!upsertData[theKey]) {
      delete upsertData[theKey];
    }
  }
}
还是我遗漏了什么