Mongoose: 弃用警告:collection.ensureIndex 已弃用。 请改用 createIndexes。

创建于 2018-08-18  ·  32评论  ·  资料来源: Automattic/mongoose

更新到5.2.9版本后,当我启动我的网络应用程序时,我一直在控制台中收到此消息:

DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.

而且我都不使用它们。

enhancement

最有用的评论

升级到 5.2.10 版本后。 以下任何选项都应该停止警告?

js mongoose.connect(config.dbUri, { useCreateIndex: true, useNewUrlParser: true })
或者
js mongoose.set('useCreateIndex', true) mongoose.connect(config.dbUri, { useNewUrlParser: true })
它在这里不起作用。 (对不起,如果我做错了什么)

所有32条评论

#6880 的副本

感谢您花时间报告问题@bricss。 Mongoose 在内部调用ensureIndex() 。 您现在可以安全地忽略该警告,或者使用节点标志--no-deprecation将其静音,或者如果 5.2.9 中没有您依赖的特定修复程序,则降级到 5.2.8。 关注#6880 获取更新👍

,unique: true,index: true 在我的一个模式中的一个字段上,它会触发此警告。 质疑如何在不收到此警告的情况下确保唯一值。

@nonniv升级到 5.2.10 并设置mongoose.set('useCreateIndex', true);

升级到 5.2.10 版本后。 以下任何选项都应该停止警告?

js mongoose.connect(config.dbUri, { useCreateIndex: true, useNewUrlParser: true })
或者
js mongoose.set('useCreateIndex', true) mongoose.connect(config.dbUri, { useNewUrlParser: true })
它在这里不起作用。 (对不起,如果我做错了什么)

@samuelcecilio您看到了哪些具体的弃用警告? 打开 #6922 的评论中有一些有用的注释,或者随时在这里分享您的具体警告,我会看看是否可以提供帮助。

(node:9125) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.

@samuelcecilio mongoose.set('useCreateIndex', true)应该停止该警告,如下例所示:

6922.js

#!/usr/bin/env node
'use strict';

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true });
mongoose.set('useCreateIndex', true);

const conn = mongoose.connection;
const Schema = mongoose.Schema;

const schema = new Schema({
  name: {
    type: String,
    unique: true
  }
});

const Test = mongoose.model('test', schema);

const test = new Test({ name: 'one' });

async function run() {
  console.log(`mongoose version: ${mongoose.version}`);
  await conn.dropDatabase();
  await test.save();
  return conn.close();
}

run();

输出:

issues: ./6922.js
mongoose version: 5.2.10
issues:

您确定您的项目使用的是 5.2.10 吗? 您的项目中是否还有其他使用其他版本的猫鼬等的软件包?

嗨,谢谢回复。 是的,我检查了 3 次版本,哈哈:

$ npm list --depth=0 ... [email protected] ...

我的代码

应用程序.js
````js
...

const config = require('./config')
const mongoose = require('mongoose')
常量表达 = 要求('表达')
常量应用程序 = 快递()

mongoose.connect(config.dbUri, { useNewUrlParser: true })
mongoose.set('useCreateIndex', true)

……

module.exports = 应用
````

斌/万维网
````js

!/usr/bin/env 节点

const app = require('../app')
const config = require('../config')
const debug = require('debug')('blitz')
常量 http = 要求('http')
常量端口 = normalizePort(process.env.PORT || config.port)
const mongoose = require('mongoose')

app.set('端口', 端口)

常量服务器 = http.createServer(app)

server.listen(端口)
server.on('error', onError)
server.on('监听', onListening)

const mongo = mongoose.connection

mongo.on('error', error => { debug('mongo: ' + error.name) })
mongo.on('connected', () => { debug('mongo: Connected') })
mongo.on('disconnected', () => { debug('mongo: Disconnected') })

……
````

当我运行DEBUG=blitz* npm run dev

````重击

nodemon bin/www

[节点监视器] 1.18.3
[nodemon]随时重启,输入rs
[nodemon] 观看:
[nodemon] 开始node bin/www
blitz 监听端口 3000 +0ms
blitz mongo:已连接 +14ms
(节点:10622)DeprecationWarning:collection.ensureIndex 已弃用。 请改用 createIndexes。
````

@samuelcecilio可能将mongoose.set('useCreateIndex', true)移动到bin/www文件? 我将设置一个快速示例并进行测试。

@samuelcecilio在玩了这个之后,我发现我需要在包含模型的路由文件中将 useCreateIndex 设置为 true。 就我而言,使用 express cli 工具后,我需要在如下所示的索引路由中设置 useCreateIndex:

var express = require('express');
var router = express.Router();
const mongoose = require('mongoose');
mongoose.set('useCreateIndex', true);
const Test = mongoose.model('test', { name: {type: String, unique: true }});

/* GET home page. */
router.get('/', function(req, res, next) {
  Test.create({ name: 'billy' }).then((doc) => {
    return res.status(200).json({ done: true, test: doc.id });
  }).catch((e) => {
    return res.status(500).json({ err: e });
  });
});

module.exports = router;

没有在我得到的索引路由中设置的选项:

[nodemon] starting `node bin/www`
version: 5.2.10
(node:17042) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.

在我得到的路线中设置选项后:

[nodemon] starting `node bin/www`
version: 5.2.10
^C

我尝试将其设置在 bin/www 中,但这并没有消除警告。 只有在路由中设置它是成功的。

卷曲 l​​ocalhost 的输出

~>: curl localhost:3000/
{"done":true,"test":"5b84a4e13ec72e4352475426"}~>: 
~>: 

我为用户、客户、供应商、订单、项目使用单独的文件。

这停止了​​警告:

模型/user.js
````js
const addressSchema = require('./address')
const profileSchema = require('./profile')
const uuidv4 = 要求('uuid/v4')
const mongoose = require('mongoose')
const Schema = mongoose.Schema

mongoose.set('useCreateIndex', true)

const userSchema = new Schema({
禁用:{类型:布尔值,默认值:false},
角色:{类型:数组,默认值:['assistant']},
身份:{类型:字符串,唯一:真,必需:真},
用户名:{类型:字符串,唯一:true,必需:true},
名称:{类型:字符串,大写:true,必需:true},
密码:{类型:字符串,必填:真},
秘密:字符串,
简介:profileSchema,
地址:地址架构,
创建日期,
修改日期
}, {
集合:'用户'
})

userSchema.pre('save', function (next) {
常量文档 = 这个
doc.created = Date.now()
doc.modified = Date.now()
doc.secret = uuidv4()
下一个()
})

module.exports = mongoose.model('User', userSchema)

````

我认为这将是一些全局设置,但显然我必须添加所有文件。

@samuelcecilio ,您可以将猫鼬包装在自定义文件中,例如

myMongoose.js

const mongoose = require('mongoose')
mongoose.set('useCreateIndex', true);
//etc
module.exports = mongoose

然后需要你的包装器const mongoose = require('myMongoose')而不是到处都是猫鼬。 当我开始升级到 5.2.8 以上时,这可能是我最终不得不做的事情。

我仍然必须修改所有当前文件。 对于models文件夹中的每个文件,我会将require ('mongoose')替换为require('myMongoose') 。 这同样适用于app.jsbin/www

问题是:在mongoose的未来版本中,我不需要包含mongoose.set ('useCreateIndex', true)或者这是否正常,因为与旧版本的 mongo、node 等的兼容性问题......?

我怀疑这种行为将保持现在的状态(必须设置变量,而不是它的内部实现),直到猫鼬的下一个主要版本(即6.0.0 )。

现在,我已将mongoose.set('useCreateIndex', true)添加到所有包含require('mongoose')的文件中。 我正在考虑使用包装器('./myMongoose')('./mongoose-custom') 。 你怎么认为?

这应该是全球性的吗? 这是一个明确的问题吗?

在每个包含模型声明的文件中添加mongoose.set('useCreateIndex', true)真的很不舒服。
为什么不让它从connect选项中工作,或者在连接之前设置它?

@samuelcecilio @bricss同意。 重新打开它以调查潜在的解决方案。

你不需要把它放在每个文件中,但不幸的是,现在你需要在任何 mongoose.model() 调用之前放置 mongoose.set('useCreateIndex', true) 。 如果您导出模型而不是模式,那将很棘手。 将为此添加修复程序。

升级到 5.2.13 版后,是否应该停止警告? 谢谢

javascript mongoose.connect(config.dbUri, { useCreateIndex: true, useNewUrlParser: true })

bash the options [useCreateIndex] is not supported server: listening on port 3000 +0ms mongo: Connected +34ms (node:18457) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.

@samuelcecilio useCreateIndex不是连接选项,但只要您在调用 $#$2$ mongoose.set('useCreateIndex', true);之前调用mongoose.model() (即使在其他文件中),对 mongoose.model 的所有后续调用都应该回退到您使用mongoose.set()设置的选项。 我用上面的例子测试了 5.2.13,而不是在 bin/www 文件中调用mongoose.set('useCreateIndex', true)不是在我的路由中。 现在可以了。

它在连接之后和所有其他文件之前与 5.2.13 一起使用。

这是我的 db.js 文件中的连接:

// Create the database connection
mongoose.connect(encodeMongoURI(dbURI), options);
mongoose.set('useCreateIndex', true);

我在一个单独的脚本中有我的 mongo 连接。 这样我只需调用 mongoose.set('useCreateIndex', true); 在实际连接到 mongo 之前。 那么就没有必要把它放在我的任何模型声明中。

@LucHighwalker的建议是正确的方法。 理想情况下,您将所有这些全局选项放在调用mongoose.connect()之前。

两者之间是否有任何功能差异

mongoose.connect(encodeMongoURI(dbURI), options);
mongoose.set('useCreateIndex', true);

mongoose.set('useCreateIndex', true);
mongoose.connect(encodeMongoURI(dbURI), options);

? 因为两者在 5.2.17 中似乎都可以正常工作

mongoose.connect(config.dbUri, { useCreateIndex: true, useNewUrlParser: true })

适用于最新版本

好的,我猜@types/mongoose 是后面的一些版本(还不能在打字稿上工作)。

mongoose.connect(url, { useNewUrlParser: true, autoIndex: false })

@Dionesio的回答对我有用。 谢谢!

mongoose.connect("mongodb://localhost:27017/test", {u​​seNewUrlParser: true});
mongoose.set('useCreateIndex', true);

这解决了我所有的弃用警告。

@samuelcecilio在玩了这个之后,我发现我需要在包含模型的路由文件中将 useCreateIndex 设置为 true。 就我而言,使用 express cli 工具后,我需要在如下所示的索引路由中设置 useCreateIndex:

var express = require('express');
var router = express.Router();
const mongoose = require('mongoose');
mongoose.set('useCreateIndex', true);
const Test = mongoose.model('test', { name: {type: String, unique: true }});

/* GET home page. */
router.get('/', function(req, res, next) {
  Test.create({ name: 'billy' }).then((doc) => {
    return res.status(200).json({ done: true, test: doc.id });
  }).catch((e) => {
    return res.status(500).json({ err: e });
  });
});

module.exports = router;

没有在我得到的索引路由中设置的选项:

[nodemon] starting `node bin/www`
version: 5.2.10
(node:17042) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.

在我得到的路线中设置选项后:

[nodemon] starting `node bin/www`
version: 5.2.10
^C

我尝试将其设置在 bin/www 中,但这并没有消除警告。 只有在路由中设置它是成功的。

卷曲 l​​ocalhost 的输出

~>: curl localhost:3000/
{"done":true,"test":"5b84a4e13ec72e4352475426"}~>: 
~>: 

谢谢 - 添加 mongoose.set('useCreateIndex', true); 解决了我的问题

我要锁定这个问题。 如需将来参考,请参阅我们文档中的弃用指南

此页面是否有帮助?
0 / 5 - 0 等级