我使用Node.js和mongodb。
var mongo = require("mongodb").MongoClient;
var url = process.env.MLAB_URI;
mongo.connect(url, function (err, db) {
if (err) {
console.log('Unable to connect to the mongoDB server. Error:', err);
} else {
//HURRAY!! We are connected. :)
console.log('Connection established');
var sequence = db.collection('sequence')
//Find and modify the sequence counter.
var obj = sequence.findAndModify({
query: {_id: 1},
update: { $inc: {seq: 1}},
new: true
});
console.log(obj);
sequence.find({_id:1}).toArray(function(err,res){
if(err)
console.log(err);
else
console.log(res)
});
db.close();
}
});
但是上面的代码没有更新数据库,返回的obj
输出是Promise { <pending> }
。
完整的输出是
Connection established
Promise { <pending> }
[ { _id: 1, seq: 0 } ]
我需要更新值并检索对象。有没有办法做到这一点? 提前谢谢!
答案 0 :(得分:1)
请按照以下说明更改findAndModify
。
var obj = sequence.findAndModify(
{_id: 1},
{},
{ $inc: {"seq": 1}},
{new:true, upsert:true}
);
避免承诺的第二个选项: -
评论console.log(obj);
var obj = sequence.findAndModify(
{_id: "1"},
{},
{ $inc: {"seq": 1}},
{new:true, upsert:true}, function (err, doc) {
if(err)
console.log(err);
else
console.log(doc);
}
);
您正在引用Mongo shell版本并尝试使用NodeJS版本实现相同的版本。 NodeJS findAndModify
版本略有不同。
为了获得seq
的旧值,您可以将new
标志设置为false,doc.value.seq
为您提供旧值(即更新前的值)。
sequence.findAndModify(
{_id: "1"},
{},
{ $inc: {"seq": 1}},
{new:false, upsert:true}, function (err, doc) {
if(err)
console.log(err);
else {
console.log(doc);
console.log(doc.value.seq);
}
});
答案 1 :(得分:0)
更改为
var obj = sequence.findOneAndModify({
_id: 1,
update: { $inc: {seq: 1}},
upsert: true
});