Mongoose选择要从findOneAndUpdate返回的字段

时间:2017-05-22 03:39:33

标签: node.js mongodb mongoose

在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....

之前有没有人实现过这个目标? 我无法在文档中找到它。

6 个答案:

答案 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)