架构和模型:
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请求中,我从包含时间戳,deviceID和温度值的外部源接收一些数据。
我的主键是timestamp_hour
和deviceID
,因此如果数据库中有现有文档,我需要将温度值存储在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");
});
现在的问题是,它用新的单个值替换文档中的整个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 } },
}
我是MEAN的新手,但我可以看到为什么我的方法不起作用,因为更新调用只是修改了嵌套对象。
我很感激有关使用正确方法实现此功能的任何帮助。
答案 0 :(得分:3)
您可以使用dot and bracket notations的组合在单个更新中执行此操作,以构建更新对象,如下所示:
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");
});
答案 1 :(得分:0)
好的,这样可行:
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);
}
});