【问题标题】:Mongoose select fields to return from findOneAndUpdateMongoose 选择要从 findOneAndUpdate 返回的字段
【发布时间】:2017-10-21 14:33:09
【问题描述】:

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

以前有人做到过吗? 我在文档中找不到它。

【问题讨论】:

标签: node.js mongodb mongoose


【解决方案1】:

对于 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)=>{}

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。您可以在帮助中心找到更多关于如何写好答案的信息:stackoverflow.com/help/how-to-answer。祝你好运?
【解决方案2】:

试试这个:

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

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

【讨论】:

    【解决方案3】:

    我们可以在使用猫鼬更新功能时排除任何字段findByIdAndUpdate在select函数的帮助下,请看下面的代码,它将从更新响应中排除密码和__v

    User.findByIdAndUpdate({ _id: req.userData.UserId },req.body,{new: true}).select({Password: 0, __v: 0 })
        .exec()
        .then(result => {})
    

    【讨论】:

      【解决方案4】:

      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,它将在更新完成后返回文档。

      【讨论】:

      • Select 可以作为对象 ``` User.findOneAndUpdate( {id}, //query { $set: { "fieldToBeChanged": "update" } }, //update {new:true,选择:{_id: 0} }, }) ```
      【解决方案5】:

      对于 MongoDb 3.2+ 版本

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

      【讨论】:

        【解决方案6】:

        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,则返回的文档处于处理更新修改之前的状态。有时这就是您的意思,但大多数时候您确实想要修改后的文档。

        【讨论】:

          【解决方案7】:

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

          【讨论】:

          • OP 询问如何从返回的模型中排除某些字段。
          猜你喜欢
          • 2016-01-26
          • 1970-01-01
          • 2016-09-13
          • 2019-05-01
          • 2021-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-12
          相关资源
          最近更新 更多