'use strict';
const assert = require('assert');
const start = require('../common');
describe('Tutorial: findOneAndUpdate()', function() {
const mongoose = new start.mongoose.Mongoose();
let Character;
before(async function() {
await mongoose.connect(start.uri);
await mongoose.connection.dropDatabase();
});
beforeEach(async function() {
mongoose.connection.deleteModel(/Character/);
Character = mongoose.model('Character', new mongoose.Schema({
name: String,
age: Number
}));
await mongoose.model('Character').deleteMany({});
await Character.create({ name: 'Jean-Luc Picard' });
});
after(async() => {
await mongoose.disconnect();
});
it('basic case', async function() {
await mongoose.model('Character').deleteMany({});
mongoose.connection.deleteModel(/Character/);
const Character = mongoose.model('Character', new mongoose.Schema({
name: String,
age: Number
}));
const _id = new mongoose.Types.ObjectId('0'.repeat(24));
let doc = await Character.create({ _id, name: 'Jean-Luc Picard' });
doc;
const filter = { name: 'Jean-Luc Picard' };
const update = { age: 59 };
doc = await Character.findOneAndUpdate(filter, update);
doc;
assert.equal(doc._id.toHexString(), _id.toHexString());
assert.equal(doc.name, 'Jean-Luc Picard');
assert.equal(doc.age, undefined);
doc = await Character.findOne(filter);
doc.age;
assert.equal(doc.name, 'Jean-Luc Picard');
assert.equal(doc.age, 59);
});
it('returnDocument option', async function() {
const filter = { name: 'Jean-Luc Picard' };
const update = { age: 59 };
const doc = await Character.findOneAndUpdate(filter, update, {
returnDocument: 'after'
});
doc.name;
doc.age;
assert.equal(doc.name, 'Jean-Luc Picard');
assert.equal(doc.age, 59);
});
it('strips undefined from updates', async function() {
const filter = { name: 'Jean-Luc Picard' };
const update = {
$set: {
name: undefined,
age: 59
}
};
const doc = await Character.findOneAndUpdate(filter, update, {
returnDocument: 'after'
});
doc.name;
doc.age;
assert.equal(doc.name, 'Jean-Luc Picard');
assert.equal(doc.age, 59);
});
it('save race condition', async function() {
const filter = { name: 'Jean-Luc Picard' };
const update = { age: 59 };
let doc = await Character.findOne({ name: 'Jean-Luc Picard' });
await Character.updateOne(filter, { name: 'Will Riker' });
doc.age = update.age;
await doc.save();
doc = await Character.findOne();
doc.name;
doc.age;
assert.equal(doc.name, 'Will Riker');
assert.equal(doc.age, 59);
});
it('upsert', async function() {
const filter = { name: 'Will Riker' };
const update = { age: 29 };
await Character.countDocuments(filter);
assert.equal(await Character.countDocuments(filter), 0);
const doc = await Character.findOneAndUpdate(filter, update, {
new: true,
upsert: true
});
doc.name;
doc.age;
assert.equal(doc.name, 'Will Riker');
assert.equal(doc.age, 29);
});
it('includeResultMetadata', async function() {
const filter = { name: 'Will Riker' };
const update = { age: 29 };
await Character.countDocuments(filter);
assert.equal(await Character.countDocuments(filter), 0);
const res = await Character.findOneAndUpdate(filter, update, {
new: true,
upsert: true,
includeResultMetadata: true
});
res.value instanceof Character;
res.lastErrorObject.updatedExisting;
assert.ok(res.value instanceof Character);
assert.ok(!res.lastErrorObject.updatedExisting);
});
});