javascript

node.js

mongodb

mongoose

nosql

While querying the documents by using collection.find I started getting following warning in my console

DeprecationWarning: collection.find option [fields] is deprecated and will be removed in a later version

Why am I seeing this and how do I fix this? (Possible alternatives)

EDIT: Query Added

Session
        .find({ sessionCode: '18JANMON', completed: false })
        .limit(10)
        .sort({time: 1})
        .select({time: 1, sessionCode: 1});

Mongoose version 5.2.9

Solution 1

Update:

5.2.10 is released and available for download here.

For more info on the docs you can view page https://mongoosejs.com/docs/deprecations

For more info on the issue and its fix https://github.com/Automattic/mongoose/issues/6880

Original Answer:

Mongoose 5.2.9 version upgraded the native mongodb driver to 3.1.3 in which changes were added to throw warning messages when the deprecated native driver method is called.

fields option is deprecated and is replaced with projection option.

You will have to wait for mongoose to make changes at their end to replace the fields option with projection. The fix is scheduled for 5.2.10 release.

For time being you can go back to 5.2.8 which will suppress all deprecation warnings.

npm install [email protected]5.2.8

For all other deprecated warnings you have to approach them case by case.

You will see other deprecation warnings when you use other collection methods.

DeprecationWarning: collection.findAndModify is deprecated. Use findOneAndUpdate, findOneAndReplace or findOneAndDelete instead.
DeprecationWarning: collection.remove is deprecated. Use deleteOne, deleteMany, or bulkWrite instead.
DeprecationWarning: collection.update is deprecated. Use updateOne, updateMany, or bulkWrite instead.
DeprecationWarning: collection.save is deprecated. Use insertOne, insertMany, updateOne, or updateMany instead.
DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.

All findOne* mongoose write methods by default use the findAndModify method which is deprecated in mongodb native driver.

Use mongoose.set('useFindAndModify', false); to have mongooose call the appropriate findOne* method on the mongodb native driver.

For remove and update replace those calls with delete* and update* methods respectively.

For save replace those calls with insert*/ update* methods respectively.

Use mongoose.set('useCreateIndex', true); to have mongooose call the createIndex method on the mongodb native driver.

Solution 2

mongoose.connect('your db url', {
  useCreateIndex: true,
  useNewUrlParser: true
})

or

mongoose.set('useCreateIndex', true)
mongoose.connect('your db url', { useNewUrlParser: true })

Solution 3

After upgrading to version 5.2.10. Any of the options below can be use

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/test', {

  useCreateIndex: true,
  useNewUrlParser: true

})
.then(() => console.log('connecting to database successful'))
.catch(err => console.error('could not connect to mongo DB', err));


or

const mongoose = require('mongoose');

mongoose.set('useCreateIndex', true);

mongoose.connect('mongodb://localhost/test',{

    useNewUrlParser: true

})
.then(() =>  console.log('connecting to database successful') )
.catch(err =>  console.error('could not connect to mongo DB', err) );

Solution 4

You can do a npm install [email protected] and this will help you get back to an earlier version which will not show any deprecation warnings

Solution 5

This worked for me at April, 2020:

mongoose.connect(process.env.DATABASE_URL, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true
})

Solution 6

mongoose.connect('mongodb://localhost:27017/tablename',{ useUnifiedTopology: true, useNewUrlParser: true,useCreateIndex: true },()=>{ console.log(connected db) });

Solution 7

I am currently using "[email protected]" you can get rid of the DeprecationWarning by using this,

Method 1

mongoose.connect("Your DB address", {
useNewUrlParser: true,                       
useUnifiedTopology: true,                 
useCreateIndex: true               // to handle collection.ensureIndex is deprecated
});

Method 2

mongoose.connect("Your DB address", {
useNewUrlParser: true,                       
useUnifiedTopology: true,                 // other deprecation warnings            
});
mongoose.set("useCreateIndex", true);     // to handle collection.ensureIndex is deprecated

Solution 8

You can also use --no-deprecation in CLI to ignore the deprecation warnings.

I was getting this warning- (node:108) [MONGODB DRIVER] Warning: collection.update is deprecated. Use updateOne, updateMany, or bulkWrite instead. by using --no-deprecation it worked fine

Check documentation here - https://nodejs.org/dist/latest-v10.x/docs/api/cli.html#cli_no_deprecation

Solution 9

Just pass following options while data base connection

for e.g.

const mongoose = require("mongoose");

mongoose.connect("uri",{ 
                       "useNewUrlParser": true,
                       "useUnifiedTopology": true, 
                       "useCreateIndex": true 
                       // other deprecations 
                       },(err)=>{
     // connection logging

});

Solution 10

mongoose.connect(process.env.DATABASE, {
 useNewUrlParser: true,
 useCreateIndex: true,
 useFindAndModify: false,
 useUnifiedTopology: true,
})
.then(() => {
 console.log("DB connected");
})
.catch((err) => console.log(`DB connection Err`, err));

Solution 11

here connectionString is your DB Address

mongoose
  .connect(connectionString, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true,
  })
  .then(
    app.listen(port, () => {
      console.log(`server started on port ${port}`);
    })
  )
  .catch((err) => console.log(err));

Solution 12

When we make connection request to connect mongo db we just have to add one more key value pair into that callback function

useCreateIndex:true

inside the function

mongoose.connect(config.DB_URI, {
  useNewUrlParser: true,
  useUnifiedTopology: true,
  useCreateIndex:true
}