Mongoose选择要从findOneAndUpdate返回的字段

22

在Node.js中使用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....

有人在以前实现过这个吗? 我在文档中找不到。


请查看此问题:https://dev59.com/iFwY5IYBdhLWcg3wRF9S - Dexter
这完全不是我要问的。我不关心使用 {new:true} 检索新数据或旧数据。请仔细阅读问题。 - Emad Said
7个回答

49

根据手册,由于存在其他细节,例如"upsert""new",因此options参数需要一个"fields"键。在您的情况下,您想要"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 ,则返回的文档是在更新处理之前的状态。有时这就是你想要的,但大多数情况下你真正想要的是修改后的文档。


13

看起来 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 这个选项不是必需的。如果省略,mongoose 默认将返回在应用更新之前的文档。将其设置为 true,它将返回更新后的文档。

new:true 选项非必须,省略时Mongoose默认返回更新前的文档,设为true则返回更新后的文档。


Select可以作为对象User.findOneAndUpdate( {id}, //查询条件 { $set: { "fieldToBeChanged": "update" } }, //更新内容 {new:true, select: {_id: 0} }, }) //返回更新后的文档,但不包括_id字段 - Sivaraj-v

3
我们可以使用mongoose update函数findByIdAndUpdate的select函数来排除任何字段,以下代码将从Update响应中排除密码和__v,请看以下示例代码。
User.findByIdAndUpdate({ _id: req.userData.UserId },req.body,{new: true}).select({Password: 0, __v: 0 })
    .exec()
    .then(result => {})

3

试试这个:

User.findOneAndUpdate({_id:'132324'}, {update: '1235'}, {new: true}).select({ _id: 0 })

select() 方法将从结果中排除 _id 字段。


0

针对 MongoDB 版本:4.0.2,mongoose 版本:5.13.7:

userModel.findOneAndUpdate({_id:'132324'},{$set: 
{"first_name":"user","last_name":"one"}}, 
{new:true,select:{first_name:1, last_name:1}},(err,data)=>{}

虽然这段代码可能回答了问题,但提供有关它如何以及/或为什么解决问题的附加上下文将改善答案的长期价值。您可以在帮助中心找到有关编写良好答案的更多信息:https://stackoverflow.com/help/how-to-answer。祝你好运! - nima

0

针对MongoDb版本3.2+

User.findOneAndUpdate(
  { "_id": "132324" },
  { "$set": { "hair_color": "yellow" } },
  {
   "projected": { "first_name":1, "last_name": 1 },
   "returnNewDocument": true 
  }
)...

-4
在findOneAndUpdate中使用选项{new: true}(默认为false)

2
OP 问如何从返回的模型中排除某些字段。 - Balázs Vincze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接