NodeJs中怎么修改 mongoose 查询到的值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NodeJs中怎么修改 mongoose 查询到的值相关的知识,希望对你有一定的参考价值。

    GroupModel.find(groupname:search_doc,function(err,doc)console.log(doc);

    //可以正常打印出整个查询到的文档!

    console.log(doc.groupname); 

    //但是不可以只打印查询到的文档groupname键的值!

参考技术A 这个查了有是没用

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

【中文标题】使用 Mongoose/NodeJS 修改具有多个键的嵌套对象而不替换现有键【英文标题】:Modify nested object with multiple keys without replacing existing keys using Mongoose/NodeJS 【发布时间】:2017-03-12 03:04:05 【问题描述】:

架构和模型:

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中。我目前从时间戳导出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 的新手,但我可以理解为什么我的方法不起作用,因为更新调用只是修改了嵌套对象。

如果能提供有关实现此功能的正确方法的任何帮助,我将不胜感激。

【问题讨论】:

【参考方案1】:

您可以在单个更新中使用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");
);

【讨论】:

是的,这行得通。万分感谢!次要跟进,我发布了另一个可行的解决方案,但是它在函数中使用了findOnesave。我猜这是两个数据库调用,那么findOneAndUpdate 在一次更新中是如何做到的? findOneAndUpdate() 发出一个 mongodb findAndModify update 命令,它是原子的,即如果您获取一个项目然后更新它,那么这两个步骤之间可能会有另一个线程进行更新。原子更新意味着您可以保证获得与您正在更新的完全相同的项目 - 即在两者之间不会发生其他操作。【参考方案2】:

好的,这样就可以了:

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);
    
);

【讨论】:

以上是关于NodeJs中怎么修改 mongoose 查询到的值的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB / Mongoose / nodejs 中的引用 - 并行化

nodejs mongoose 分页查询

Mongoose - 检索到的文档中没有“_id”属性

按月对记录进行分组并计数 - Mongoose、nodeJs、mongoDb

nodejs 连接mongoose 报错 connect ECONNREFUSED怎么解决

使用mongodb和mongoose(nodejs)的不同字段名称映射多个数据源