Automattic / mongoose

MongoDB object modeling designed to work in an asynchronous environment.
https://mongoosejs.com
MIT License
26.91k stars 3.83k forks source link

Top-level use of w, wtimeout, j, and fsync is deprecated. Use writeConcern instead. #10009

Closed ChoppinBlockParty closed 3 years ago

ChoppinBlockParty commented 3 years ago

I am getting this error when

await TaskModel.updateOne(
  {
    name
  },
  {
    state: 'requested'
  },
  {
    upsert: true,
    writeConcern: {
      w: 'majority',
      j: true,
      wtimeout: 15000
    }
  }
).exec()

It does not seem like a top-level w, j, etc. and I am using writeConcern. What am I doing wrong?

Mongoose version: 5.11.18.

dbronin commented 3 years ago

@ChoppinBlockParty I see the same thing on my end; it looks like maybe there are some defaults injected?

If you change the writeConcern object to a string, like so <<writeConcern: 'majority'>>, you no longer get the warning. I am guessing the object approach has a bug.

ChoppinBlockParty commented 3 years ago

@dbronin Sorry, did not get it. How do i need covert the writeConcern?

dbronin commented 3 years ago

@ChoppinBlockParty I am not sure that you can if you need all 3 parameters. If you want to just specify the w, you can set writeConcern: 'majority'

sibelius commented 3 years ago

it looks like this is related to a change on MongoClient

https://github.com/strongloop/loopback-connector-mongodb/issues/616

IslandRhythms commented 3 years ago
const mongoose = require('mongoose');

const UserSchema = mongoose.Schema({
  email: { type: String, required: true },
  firstName: { type: String, required: true },
  lastName: { type: String, required: true }
},{autocreate:true});

const User = mongoose.model('User', UserSchema);

(async function() {
  await mongoose.connect('mongodb://localhost:27017/test', {
    useNewUrlParser: true,
    useUnifiedTopology: true
  });

  const user = await User.create({
    email: 'bill@microsoft.com',
    firstName: 'Bill',
    lastName: 'Gates'
  });

  User.updateOne({firstName: 'Bill'},{firstName: 'Jill'},{upsert:true, writeConcern: {w:'majority', j:true, wtimeout:15000}}).exec();
  console.log('Done', user.firstName);
})();
ChoppinBlockParty commented 3 years ago

I set up the write concern like this

const MySchema = new Schema(
    {
        _id: { type: Number, required: true },
        requestId: { type: Types.ObjectId, required: true },
        op: { type: String, required: true },
        size: { type: Number, required: true },
        totalSize: { type: Number, required: true }
    },
    {
        versionKey: false,
        writeConcern: {
            w: 'majority',
            j: true,
            wtimeout: 15000
        }
    }
)

I still continue to get the warning even with 5.12.3 (mongodb@3.6.5) version.

(node:468715) [MONGODB DRIVER] Warning: Top-level use of w, wtimeout, j, and fsync is deprecated. Use writeConcern instead.
    at emitWarning (/home/yuki/prj/vir/node_modules/mongodb/lib/utils.js:844:17)
    at Object.emitWarningOnce (/home/yuki/prj/vir/node_modules/mongodb/lib/utils.js:863:12)
    at Function.fromOptions (/home/yuki/prj/vir/node_modules/mongodb/lib/write_concern.js:82:11)
    at applyWriteConcern (/home/yuki/prj/vir/node_modules/mongodb/lib/utils.js:450:37)
    at updateDocuments (/home/yuki/prj/vir/node_modules/mongodb/lib/operations/common_functions.js:339:18)
    at UpdateOneOperation.execute (/home/yuki/prj/vir/node_modules/mongodb/lib/operations/update_one.js:31:5)
    at /home/yuki/prj/vir/node_modules/mongodb/lib/operations/execute_operation.js:72:19
    at maybePromise (/home/yuki/prj/vir/node_modules/mongodb/lib/utils.js:685:3)
    at executeOperation (/home/yuki/prj/vir/node_modules/mongodb/lib/operations/execute_operation.js:34:10)
    at Collection.updateOne (/home/yuki/prj/vir/node_modules/mongodb/lib/collection.js:763:10)
    at NativeCollection.<computed> [as updateOne] (/home/yuki/prj/vir/node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js:218:28)
    at NodeCollection.updateOne (/home/yuki/prj/vir/node_modules/mquery/lib/collection/node.js:82:19)
    at model.Query._updateThunk (/home/yuki/prj/vir/node_modules/mongoose/lib/query.js:3829:23)
    at model.Query.<anonymous> (/home/yuki/prj/vir/node_modules/mongoose/lib/query.js:3889:23)
    at model.Query._wrappedThunk [as _updateOne] (/home/yuki/prj/vir/node_modules/mongoose/lib/helpers/query/wrapThunk.js:16:8)
    at /home/yuki/prj/vir/node_modules/kareem/index.js:370:33
IslandRhythms commented 3 years ago
const mongoose = require('mongoose');
const {Schema} = mongoose;

const MySchema = new Schema(
    {
        _id: { type: Number, required: true },
        op: { type: String, required: true },
        size: { type: Number, required: true },
        totalSize: { type: Number, required: true }
    },
    {
        versionKey: false,
        writeConcern: {
            w: 'majority',
            j: true,
            wtimeout: 15000
        }
    }
)

const Test = mongoose.model('Test', MySchema);

async function test() {
    await mongoose.connect('mongodb://localhost:27017/test', {
        useNewUrlParser: true,
        useUnifiedTopology: true
      });

      await mongoose.connection.dropDatabase();

      const entry = await Test.create({_id: 123454677898,  op: 'help', size: 54, totalSize: 104})
      await entry.save();
}
test();