我在运行端点时会返回此对象的update方法有问题
{n:1,nModified:1,ok:1}
这是我尝试过的代码,我尝试使用 {new:true} ,但这无济于事,我想找回更新的数据。
router.put('/:username/experience/edit/:id', function(req, res) {
const { title, company, location, from, to, workingNow, description } = req.body;
User
.update({'experience._id': req.params.id},
{'$set': {
'experience.$.title': title,
'experience.$.company': company,
'experience.$.location': location,
'experience.$.from': from,
'experience.$.to': to,
'experience.$.workingNow': workingNow,
'experience.$.description': description,
}},
function(err, model) {
console.log(model);
if(err){
return res.send(err);
}
return res.json(model);
});
})
答案 0 :(得分:0)
如果您使用的是MongoDB 3.0或更高版本,则需要使用.findOneAndUpdate()
并使用projection
选项来指定要返回的字段子集。您还需要将returnNewDocument
设置为true
。当然,您需要在此处使用$elemMatch
投影运算符,因为您不能使用位置投影并返回新文档。
有人指出:
您应该使用
.findOneAndUpdate()
,因为.findAndModify()
在每个官方语言驱动程序中均已弃用。另一件事是,.findOneAndUpdate()
的驱动程序之间的语法和选项非常一致。使用.findAndModify()
时,大多数驱动程序不会通过“查询/更新/字段”键使用相同的单个对象。因此,当有人申请另一种语言来保持一致时,它会减少一些混乱。.findOneAndUpdate()
的标准化API更改实际上对应于服务器版本3.x,而不是3.2.x。完全的区别是shell方法在实现该方法时实际上落后于其他驱动程序(一次!)。因此,大多数驱动程序实际上都具有与3.x发行版相对应的主要发行版变更。
db.collection.findOneAndUpdate(
{
"_id": ObjectId("56d6a7292c06e85687f44541"),
"rankings._id" : ObjectId("46d6a7292c06e85687f55543")
},
{ $inc : { "rankings.$.score" : 1 } },
{
"projection": {
"rankings": {
"$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") }
}
},
"returnNewDocument": true
}
)
从MongoDB 3.0开始,您需要使用findAndModify
和fields
选项,还需要将new
设置为true
来返回新值。 / p>
db.collection.findAndModify({
query: {
"_id": ObjectId("56d6a7292c06e85687f44541"),
"rankings._id" : ObjectId("46d6a7292c06e85687f55543")
},
update: { $inc : { "rankings.$.score" : 1 } },
new: true,
fields: {
"rankings": {
"$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") }
}
}
})
两个查询都产生:
{
"_id" : ObjectId("56d6a7292c06e85687f44541"),
"rankings" : [
{
"_id" : ObjectId("46d6a7292c06e85687f55543"),
"name" : "Ranking 2",
"score" : 11
}
]
}