使用Mongoose / NodeJS

时间:2016-10-29 10:48:06

标签: json node.js mongodb mongoose

架构和模型:

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_hourdeviceID,因此如果数据库中有现有文档,我需要将温度值存储在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的新手,但我可以看到为什么我的方法不起作用,因为更新调用只是修改了嵌套对象。

我很感激有关使用正确方法实现此功能的任何帮助。

2 个答案:

答案 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);
    }
});