【问题标题】:DeprecationWarning: collection.findAndModify is deprecated. Use findOneAndUpdate, findOneAndReplace or findOneAndDelete instead?弃用警告:collection.findAndModify 已弃用。改用 findOneAndUpdate、findOneAndReplace 或 findOneAndDelete?
【发布时间】:2019-03-05 11:39:13
【问题描述】:

我正在使用猫鼬findOneAndUpdate,但仍然出现错误,

DeprecationWarning:collection.findAndModify 已弃用。请改用 findOneAndUpdate、findOneAndReplace 或 findOneAndDelete。

但我什至没有使用findAndModify,为什么它将我的查询转换为findAndModify

【问题讨论】:

  • 你用的是哪个版本的猫鼬?
  • @ShivamPandey 最新的 5.3.0
  • 它最近刚刚发布。我会说他们应该在他们的版本中添加更改日志。
  • 当我使用 findByIdAndUpdate 时出现该警告

标签: node.js mongodb mongoose deprecated


【解决方案1】:

要修复所有弃用警告,请按照以下步骤操作:

mongoose.set('useNewUrlParser', true);
mongoose.set('useFindAndModify', false);
mongoose.set('useCreateIndex', true);
mongoose.set('useUnifiedTopology', true);

将 update() 替换为 updateOne()、updateMany() 或 replaceOne() 将 remove() 替换为 deleteOne() 或 deleteMany()。 将 count() 替换为 countDocuments(),除非您想计算整个集合中有多少文档(无过滤器)。在后一种情况下,使用estimatedDocumentCount()。

【讨论】:

    【解决方案2】:
      mongoose.set('useNewUrlParser', true);
      mongoose.set('useFindAndModify', false);
      mongoose.set('useCreateIndex', true);
      mongoose.set('useUnifiedTopology', true);
    

    这些解决方案对我有用!

    【讨论】:

      【解决方案3】:

      Mongoose 版本更新这么多,

      对于使用Model.findByIdAndUpdate(),它需要一个选项参数,见下文

      List.findByIdAndUpdate(id, update, options, callback) // executes
      

      解决这个问题

      在开头的 mongoose.connect 中传递这个useFindAndModify: false

      mongoose.connect("mongodb://localhost:27017/yourDatabase", { useNewUrlParser: true, useUnifiedTopology: true ,useFindAndModify: false });
      

      mongoose.set('useFindAndModify', false); 
      

      clickhere 检查相关的弃用情况

      【讨论】:

        【解决方案4】:
        Mongoose.connect(Config.database,{useUnifiedTopology: true,useNewUrlParser: true,useFindAndModify:false});
        

        跳过所有错误:-) 将此添加到您的 index.js 或您命名的任何内容上。我的意思是主js文件。 ;-)

        【讨论】:

          【解决方案5】:

          您必须更改连接方法选项以消除错误:

          mongoose.connect("mongodb://localhost/DB_Name", {
            keepAlive: true,
            useNewUrlParser: true,
            useCreateIndex: true,
            useFindAndModify: false
          });
          

          你可以这样使用它。

          【讨论】:

            【解决方案6】:

            您需要将查询useFindAndModify中的选项设置为false,如docs中所述。

            (搜索关键字目前支持的选项有

            'useFindAndModify':默认为真。设置为 false 以使 findOneAndUpdate() 和 findOneAndRemove() 使用原生 findOneAndUpdate() 而不是 findAndModify()。

            如果你看到mongoose的定义文件,其中提到它调用findAndModify更新命令。

             /**
              * Issues a mongodb findAndModify update command.
              * Finds a matching document, updates it according to the update arg, 
                passing any options,
              * and returns the found document (if any) to the callback. The query 
                executes immediately
              * if callback is passed else a Query object is returned.
              */
             findOneAndUpdate(): DocumentQuery<T | null, T>;
            

            最近在 mongoose 文档 (Click here) 中针对提到的这些弃用进行了更新:

            Mongoose 的 findOneAndUpdate() 早于 MongoDB 驱动程序的 findOneAndUpdate() 函数,所以它使用 MongoDB 驱动程序的 findAndModify() 函数。

            您可以通过三种或更多方式避免使用FindAndModify

            1. 在全局级别:将选项设置为 false。
            // Make Mongoose use `findOneAndUpdate()`. Note that this option is `true`
            // by default, you need to set it to false.
            mongoose.set('useFindAndModify', false);
            
            1. 在连接级别:我们可以使用连接选项进行配置:
                mongoose.connect(uri, { useFindAndModify: false });
            
            1. 在查询级别:
               await ModelName.findOneAndUpdate({matchQuery},
               {$set: updateData}, {useFindAndModify: false});
            
            

            【讨论】:

              【解决方案7】:

              像这样全局更改 mongoose 配置:

              mongoose.set('useFindAndModify', false);
              

              或者像这样在查询字符串中传递选项:

              Person.findOneAndUpdate({_id: id}, {$set: body}, {new: true, useFindAndModify: false}).then(..
              

              您还可以管理提到的其他猫鼬弃用警告docs

              mongoose.set('useNewUrlParser', true);
              mongoose.set('useCreateIndex', true);
              

              就是这样。

              【讨论】:

              • 感谢这个解决方案,我使用了 {new: true, useFindAndModify: false}
              • 这真的有效! - {new: true, useFindAndModify: false}
              【解决方案8】:

              您也可以通过要求选项useNewUrlParser 在连接处传递选项。看下面->https://mongoosejs.com/docs/deprecations.html

              mongoose.connect(config.MONGODB_URI, { useNewUrlParser: true, useFindAndModify: false}); 
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-12-06
                • 2015-03-23
                • 2019-07-09
                • 1970-01-01
                • 2021-12-19
                • 2021-02-19
                相关资源
                最近更新 更多