很抱歉提出这个非常基本的问题,但我真的希望这段代码能够正常运行。
在node.js中,我使用.updateOne()函数成功更新了我的mongo数据库,并将参数保持为空白,如下所示。我认为它会更新最近添加的集合文档,但它会更改最旧的文档。
如何在不循环浏览整个集合的情况下更新集合中最近添加的文档?任何建议都有帮助,我愿意使用其他功能,但不会这样做。
“重要部分”:
var collection = db.collection('SensorValues');
collection.updateOne({}
, {$set:{"VSWR":9999999999999999999,"updatedAt":finalid}}, function(err,result){
console.log("Look I updated something");
});
“整件事”:
var mongodb = require('mongodb');
var MongoClient = mongodb.MongoClient;
var url = 'mongodb://localhost:27017/DatabaseForTestFinal';
MongoClient.connect(url, function (err, db) {
if (err) {
console.log('Unable to connect to the mongoDB server. Error:', err);
} else {
console.log('Connection established to', url);
var collection = db.collection('SensorValues');
var curDate = new Date();
var day = curDate.getDate();
var month = curDate.getMonth()+1;
var year = curDate.getFullYear();
var hours = curDate.getHours();
var min = curDate.getMinutes();
if(month<10)
month ="0"+month;
if(day<10)
day="0"+day;
if(min<10)
min="0"+min;
var finalid=""+year+" "+month+" "+day+" "+hours+" "+min;
console.log(finalid);
console.log('about to update');
var collection = db.collection('SensorValues');
collection.updateOne({}
, {$set:{"VSWR":9999999999999999999,"updatedAt":finalid}}, function(err,result){
console.log("Look I updated something");
});
}
db.close();
});
答案 0 :(得分:1)
只需使用db.collection.findOneAndUpdate()
而不是db.collection.updateOne()
添加第三个参数选项returnNewDocument: true
。
returnNewDocument 如果为true,则返回更新的文档而不是原始文档。默认为false。
在https://docs.mongodb.com/manual/reference/method/db.collection.findOneAndUpdate/
了解详情答案 1 :(得分:0)
解决!!!!如果不覆盖mongo提供集合中的每个文档的_id,那将非常简单。你所要做的就是: - 将过滤器选项留空 - 将排序设置为_id:-1
这是我的解决方案:
var collection = db.collection('SensorValues');//change as needed
//NOTE: {} and sort{_id:-1} both return the newest document
collection.findOneAndUpdate(
{},
{$set:{"VSWR":0,"updatedAt":finalid}},//change as needed
{
sort: {_id:-1},
}
);
除了最新版本的Node.js之外,我还没有测试过它,但我希望它有所帮助。