NodeJs中怎么修改 mongoose 查询到的值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NodeJs中怎么修改 mongoose 查询到的值相关的知识,希望对你有一定的参考价值。
GroupModel.find(groupname:search_doc,function(err,doc)console.log(doc);
//可以正常打印出整个查询到的文档!
console.log(doc.groupname);
//但是不可以只打印查询到的文档groupname键的值!
使用 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_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 的新手,但我可以理解为什么我的方法不起作用,因为更新调用只是修改了嵌套对象。
如果能提供有关实现此功能的正确方法的任何帮助,我将不胜感激。
【问题讨论】:
【参考方案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");
);
【讨论】:
是的,这行得通。万分感谢!次要跟进,我发布了另一个可行的解决方案,但是它在函数中使用了findOne
和save
。我猜这是两个数据库调用,那么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 中的引用 - 并行化
按月对记录进行分组并计数 - Mongoose、nodeJs、mongoDb