gpt4 book ai didi

json - 使用 Mongoose/NodeJS 修改具有多个键的嵌套对象而不替换现有键

转载 作者:可可西里 更新时间:2023-11-01 10:02:47 26 4
gpt4 key购买 nike

架构和模型:

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,所以如果数据库中有一个现有的文档,我需要存储分钟的温度值:{ [minute_value]:温度。我目前从时间戳中导出 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 的新手,但我明白为什么我的方法不起作用,因为更新调用只是修改了嵌套对象。

对于实现此功能的正确方法,我将不胜感激。

最佳答案

您可以使用 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");
});

关于json - 使用 Mongoose/NodeJS 修改具有多个键的嵌套对象而不替换现有键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40318321/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com