用多个键修改嵌套的对象,而不用使用Mongoose / NodeJSreplace现有的键

架构和模型:

var schema = new mongoose.Schema({ timestamp_hour: Date, deviceID: Number, minutes: { '0': {temperature: Number}, '1': {temperature: Number}, . . . '59': {temperature: Number} } },{ collection: 'devices' }); var model = mongoose.model('deviceData', schema); 

现在,在POST请求中,我从包含时间戳,设备ID和温度值的外部源接收一些数据。

我的主键是timestamp_hourdeviceID ,所以如果数据库中有一个现有的文档,我需要以minutes: {[minute_value]: temperature}来存储温度值minutes: {[minute_value]: temperature} 。 我目前从时间戳派生minute_value ,我可以查询数据库,一切都很好。 现在我需要通过添加新的键值对来更新文档中的minutes对象。

所以在派生所需的值后,我试着运行这个:

 var query = {timestamp_hour: timestamp, deviceID: deviceID}; var update = {minutes: {[minute]: {temperature: tempData}}}; deviceData.findOneAndUpdate(query, update, {upsert: true}, function(err, doc){ if(err) return res.send(500, {error: err}); return res.send("successfully saved"); }); 

现在的问题是,它将用新的单值replace文档中的整个minutes对象。

例:

原始文件:

 { "deviceID" : 1, "timestamp_hour" : ISODate("2016-10-29T08:00:00Z"), "minutes" : { "38" : { "temperature" : 39.5 } }, } 

更新后的文件:

 { "deviceID" : 1, "timestamp_hour" : ISODate("2016-10-29T08:00:00Z"), "minutes" : { "39" : { "temperature" : 38.0 } }, } 

我需要的:

 { "deviceID" : 1, "timestamp_hour" : ISODate("2016-10-29T08:00:00Z"), "minutes" : { "38" : { "temperature" : 39.5 } "39" " { "temperature" : 38.0 } }, } 

我是新来的平均水平,但我可以看到为什么我的方法不起作用,因为更新调用只是修改嵌套的对象。

我会很感激任何帮助正确的方法来实现这一function。

您可以在单个更新中使用点和括号符号的组合来执行此操作,以构build更新对象,如下所示:

 var query = { "timestamp_hour": timestamp, "deviceID": deviceID }, update = { "$set": { } }, options = { "upsert": true }; update["$set"]["minutes."+ minute] = { "temperature": tempData }; deviceData.findOneAndUpdate(query, update, options, function(err, doc){ if(err) return res.send(500, {error: err}); return res.send("successfully saved"); }); 

好的,所以这个工作:

 deviceData.findOne(query, function(err, doc) { if(err) return done(err); if(!doc){ data.save(function(err){ if(err) throw err; res.json({"Result":"Success"}); }); } else { doc.minutes[minute] = {temperature: tempData} doc.save(function(err) {}); res.json(doc); } });