Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions lib/model.js
Original file line number Diff line number Diff line change
Expand Up @@ -829,6 +829,12 @@ Model.prototype.deleteOne = function deleteOne(options) {
query.post(function queryPostDeleteOne(cb) {
self.constructor._middleware.execPost('deleteOne', self, [self], {}, cb);
});
query.transform(function setIsDeleted(result) {
if (result && result.deletedCount != null && result.deletedCount > 0) {
self.$isDeleted(true);
}
return result;
});

return query;
};
Expand Down
35 changes: 35 additions & 0 deletions test/document.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,41 @@ describe('document', function() {
const found = await Test.findOne({ _id: doc._id });
assert.strictEqual(found, null);
});

it('sets $isDeleted to true after successful delete (gh-15878)', async function() {
const schema = new Schema({ name: String });
const Product = db.model('Test', schema);

const product = await Product.create({ name: 'test product' });
assert.strictEqual(product.$isDeleted(), false);

const result = await product.deleteOne();
assert.strictEqual(product.$isDeleted(), true);
assert.strictEqual(result.deletedCount, 1);

// Verify document was actually deleted
const found = await Product.findById(product._id);
assert.strictEqual(found, null);

// Verify deleteOne is a no-op when $isDeleted is true
const result2 = await product.deleteOne();
assert.strictEqual(result2, undefined);
assert.strictEqual(product.$isDeleted(), true);
});

it('does not set $isDeleted if delete fails', async function() {
const schema = new Schema({ name: String });
const Product = db.model('Test', schema);

const product = await Product.create({ name: 'test product' });
await Product.deleteOne({ _id: product._id }); // Delete using static method

assert.strictEqual(product.$isDeleted(), false);

// Try to delete again - should result in 0 deletedCount
await product.deleteOne();
assert.strictEqual(product.$isDeleted(), false);
});
});

describe('updateOne', function() {
Expand Down