在Nodejs中使用Mongoose,您可以使用find返回一些字段。 例如
User.findOne({_id:'132324'}, {first_name:1, last_name:1}).exec...
但我似乎无法弄清楚如何使用findOneAndUpdate返回某些字段。
User.findOneAndUpdate({_id:'132324'}, {$set : {..bla bla}}, {first_name:1, last_name:1}).exec....
之前有没有人实现过这个目标? 我无法在文档中找到它。
答案 0 :(得分:20)
从manual开始,options
参数中需要一个"fields"
密钥,因为还有其他详细信息,例如"upsert"
和"new"
。在您的情况下,也需要"new"
选项:
User.findOneAndUpdate(
{ "_id": "132324" },
{ "$set": { "hair_color": "yellow" } },
{
"fields": { "first_name":1, "last_name": 1 },
"new": true
}
).exec(...)
或者您可以使用.select()
User.select({ "first_name": 1, "last_name": 1 }).findOneAndUpdate(
{ "_id": "132324" },
{ "$set": { "hair_color": "yellow" } },
{ "new": true }
).exec(...)
注意到在没有"new": true
的情况下,返回的文档处于之前的状态,处理了更新的修改。有时这就是你的意思,但大多数时候你真的想要修改过的文件。
答案 1 :(得分:5)
findByIdAndUpdate
的语法似乎已经改变了一点。
它采用Model.findByIdAndUpdate(query, update, options, (optional callback))
根据文档,要指定返回哪些字段,您必须在 options 参数中指定它们。因此,使用上面的示例将是:
User.findOneAndUpdate(
{id}, //query
{ $set: { "fieldToBeChanged": "update" } }, //update
{new:true, select: "fieldIWant anotherFieldIWant"}, //options
})
不需要new:true
选项。如果省略,猫鼬默认为在应用更新之前返回文档。设置为true,将在完成更新后返回文档。
答案 2 :(得分:1)
我们可以在使用 mongoose 更新函数 findByIdAndUpdate 的帮助下,在 select 函数的帮助下排除任何字段,请查看以下代码,它将从更新响应中排除密码和 __v
User.findByIdAndUpdate({ _id: req.userData.UserId },req.body,{new: true}).select({Password: 0, __v: 0 })
.exec()
.then(result => {})
答案 3 :(得分:0)
对于MongoDb 3.2+版本
User.findOneAndUpdate(
{ "_id": "132324" },
{ "$set": { "hair_color": "yellow" } },
{
"projected": { "first_name":1, "last_name": 1 },
"returnNewDocument": true
}
)...
答案 4 :(得分:0)
试试这个:
User.findOneAndUpdate({_id:'132324'}, {update: '1235'}, {new: true}).select({ _id: 0 })
select()
将从结果中排除 _id
字段。
答案 5 :(得分:-3)
在findOneAndUpdate中使用选项{new:true}(默认值:false)