Mongoose选择要从findOneAndUpdate返回的字段

Ema*_*aid 10 mongoose mongodb node.js

在Nodejs中使用Mongoose,您可以使用find返回一些字段.例如.

User.findOne({_id:'132324'}, {first_name:1, last_name:1}).exec...
Run Code Online (Sandbox Code Playgroud)

但我似乎无法弄清楚如何使用findOneAndUpdate返回某些字段.

User.findOneAndUpdate({_id:'132324'}, {$set : {..bla bla}}, {first_name:1, last_name:1}).exec....
Run Code Online (Sandbox Code Playgroud)

以前有人有过这个吗?我在文档中找不到它.

Nei*_*unn 23

手册中,options参数需要一个"fields"关键字,因为还有其他细节,例如"upsert""new"适用的地方.在您的情况下,您需要"new"选项:

User.findOneAndUpdate(
  { "_id": "132324" },
  { "$set": { "hair_color": "yellow" } },
  {
   "fields": { "first_name":1, "last_name": 1 },
   "new": true 
  }
).exec(...)
Run Code Online (Sandbox Code Playgroud)

或者你可以使用 .select()

User.select({ "first_name": 1, "last_name": 1 }).findOneAndUpdate(
  { "_id": "132324" },
  { "$set": { "hair_color": "yellow" } },
  { "new": true }
).exec(...)
Run Code Online (Sandbox Code Playgroud)

注意到没有"new": true返回的文档处于更新修改处理之前的状态.有时这就是你的意思,但大多数时候你真的想要修改过的文档.


Nei*_*eil 9

似乎语法findByIdAndUpdate发生了一些变化。

它的形式为 Model.findByIdAndUpdate(query, update, options, (optional callback))

根据文档,要指定返回哪些字段,您必须在options参数中指定它们。因此,使用上面的示例将是:

User.findOneAndUpdate(
  {id},  //query
  { $set: { "fieldToBeChanged": "update" } },  //update
  {new:true, select: "fieldIWant anotherFieldIWant"}, //options
})
Run Code Online (Sandbox Code Playgroud)

new:true选项是没有必要的。如果省略 mongoose 默认在应用更新之前返回文档。设置为 true,它将在更新完成后返回文档。