为啥我收到 createIndex deprecation 错误?

Posted

技术标签:

【中文标题】为啥我收到 createIndex deprecation 错误?【英文标题】:Why am I getting createIndex deprecation error?为什么我收到 createIndex deprecation 错误? 【发布时间】:2021-10-29 12:49:56 【问题描述】:

所以我正在使用 TypeScript 构建一个 express 服务器,使用 mongooseMongoDB Atlas 进行交互。最近我决定在我的应用程序中使用多个数据库并更改我的模式以适应这种新的“架构”。但是这样做会出现deprecation warning

(node:2096) DeprecationWarning: collection.ensureIndex 已被弃用。请改用 createIndexes。 (使用node --trace-deprecation ... 显示警告的创建位置)

我已经确定了错误发生的位置。当我将架构映射到猫鼬模型时,就会发生这种情况。

发生错误的实现代码:

const db = mongoose.connection.useDb("Authentication");
const User = db.model<UserInterface>("User", UserSchema);

不发生错误的实现代码:

const User = mongoose.model<UserInterface>("User", UserSchema);

这是我与 mongodb 的连接逻辑:

import mongoose from "mongoose";

async function connect() 
   try 
      const uri = <string>process.env.MONGO_URI;
      await mongoose.connect(uri, 
         useNewUrlParser: true,
         useUnifiedTopology: true,
         useCreateIndex: true,
      );
      console.log("MongoDB Connected...");
      return;
    catch (err) 
      process.exit(1);
   


export default connect;

如您所见,我已经拥有useCreateIndex: true,所以我不知道为什么会发生错误。 当我将它添加到架构时,错误确实消失了,但我认为它不是一个好的解决方案:

 timestamps: true, autoIndex: false 

那么我在这里做错了什么?谢谢!

【问题讨论】:

这能回答你的问题吗? (node:63208) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead @MattU 我收回了哈哈。似乎在做 mongoose.connect() 之前使用 mongoose.set(...) 设置是解决方案。我在您链接的帖子的其中一个 cmets 中找到了它。谢谢! 这能回答你的问题吗? MongoDB mongoose Deprecation Warning 【参考方案1】:

好的,看起来解决方案是使用mongoose.set(...) 之前使用mongoose.connect(...)。所以这让我的弃用警告消失了:

import mongoose from "mongoose";

async function connect() 
   try 
      const uri = <string>process.env.MONGO_URI;
      mongoose.set("useNewUrlParser", true);
      mongoose.set("useUnifiedTopology", true);
      mongoose.set("useCreateIndex", true);
      mongoose.set("useFindAndModify", false);
      await mongoose.connect(uri);
      console.log("MongoDB Connected...");
      return;
    catch (err) 
      process.exit(1);
   


export default connect;

我总是看到其他人在 connect 函数中设置这些选项,所以我从来不知道 set 函数。

【讨论】:

以上是关于为啥我收到 createIndex deprecation 错误?的主要内容,如果未能解决你的问题,请参考以下文章

[DEPRECATION] Encountered positional parameter near xxx Positional parameter are considered depreca

发出 dataChanged(createIndex(1,1),createIndex(1,1)) 导致许多 ::data 调用

EF 代码优先:CreateIndex - 覆盖索引

QSortFilterProxyModel.mapToSource 崩溃。没有信息为啥

带有绑定对象的 CreateIndex

在 Android 中,如何删除已弃用的通知变量?