Mongoose: DeprecationWarning:collection.ensureIndexは非推奨です。 代わりにcreateIndexesを使用してください。

作成日 2018年08月18日  ·  32コメント  ·  ソース: Automattic/mongoose

バージョン5.2.9に更新した後、Webアプリを起動すると、コンソールに次のメッセージが表示されます。

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は私のスキーマの1つのフィールドにあり、この警告をトリガーします。 この警告を受け取らずに一意の値を確保する方法について質問してください。

@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] ...

私のコード

app.js
`` `` js
..。

const config = require( './ config')
const mongoose = require( 'mongoose')
const express = require( 'express')
const app = express()

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

...。

module.exports = app
`` ``

bin / www
`` `` js

!/ usr / bin / envノード

const app = require( '../ app')
const config = require( '../ config')
const debug = require( 'debug')( 'blitz')
const http = require( 'http')
const port = normalizePort(process.env.PORT || config.port)
const mongoose = require( 'mongoose')

app.set( 'port'、port)

const server = http.createServer(app)

server.listen(port)
server.on( 'error'、onError)
server.on( 'listening'、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を実行すると

`` `` bash

nodemon bin / www

[ノードモン] 1.18.3
[nodemon]いつでも再起動するには、 rsと入力します
[nodemon]ウォッチング:
[nodemon]開始node bin/www
blitzポート3000 + 0msでリッスン
blitz mongo:接続済み+ 14ms
(node:10622)DeprecationWarning:collection.ensureIndexは非推奨になりました。 代わりにcreateIndexesを使用してください。
`` ``

@samuelcecilioは、代わりにmongoose.set('useCreateIndex', true)bin/wwwファイルに移動しますか? エクスプレスの例を設定してテストします。

@samuelcecilioを試してみたところ、モデルを含むルートファイルでuseCreateIndexをtrueに設定する必要があることがわかりました。 私の場合、エクスプレス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に設定してみましたが、警告が消えませんでした。 ルートに設定するだけで成功しました。

カーリングローカルホストの出力

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

私はユーザー、顧客、サプライヤー、注文、アイテムに別々のファイルを使用しています。

これにより警告が停止しました。

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

mongoose.set( 'useCreateIndex'、true)

const userSchema = new Schema({
無効:{タイプ:ブール値、デフォルト:false}、
役割:{タイプ:配列、デフォルト:['アシスタント']}、
アイデンティティ:{タイプ:文字列、一意:true、必須:true}、
ユーザー名:{タイプ:文字列、一意:true、必須:true}、
名前:{タイプ:文字列、大文字:true、必須:true}、
パスワード:{タイプ:文字列、必須:true}、
シークレット:文字列、
プロファイル:profileSchema、
アドレス:addressSchema、
作成日、
変更日:日付
}、{
コレクション: 'ユーザー'
})

userSchema.pre( 'save'、function(next){
const doc = this
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 )まで、動作は現在のままであると思われます(変数の内部実装ではなく、変数を設定する必要があります)。

今のところ、 require('mongoose')を含むすべてのファイルにmongoose.set('useCreateIndex', true)を追加しました。 ラッパー('./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は接続オプションではありませんが、 mongoose.model()を呼び出す前にmongoose.set('useCreateIndex', true);を呼び出す限り(他のファイルでも)、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はそれより後のいくつかのバージョンだと思います(typescriptではまだ機能しません)。

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

@Dionesioの答えは私にトリックをしました。 ありがとう!

mongoose.connect( "mongodb:// localhost:27017 / test"、{useNewUrlParser:true});
mongoose.set( 'useCreateIndex'、true);

これにより、すべての非推奨の警告が解決されました。

@samuelcecilioを試してみたところ、モデルを含むルートファイルでuseCreateIndexをtrueに設定する必要があることがわかりました。 私の場合、エクスプレス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に設定してみましたが、警告が消えませんでした。 ルートに設定するだけで成功しました。

カーリングローカルホストの出力

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

ありがとう-mongoose.set( 'useCreateIndex'、true);を追加します。 私の問題を修正しました

この問題をロックします。 今後の参考のために、ドキュメントの非推奨ガイドを参照してください

このページは役に立ちましたか?
0 / 5 - 0 評価