How to Fix 'Query was already executed' in Mongoose
Apr 21, 2022
Mongoose throws a 'Query was already executed' error when a given query is executed twice.
The most common explanation for this is you're mixing await
and callbacks.
// Causes "MongooseError: Query was already executed" error. That's because Mongoose
// executes a query when it receives a callback _or_ when you `await`. If you
// `await` and pass a callback, this query executes twice.
await Model.updateMany({}, { $inc: { count: 1 } }, function(err) { /* ... */ });
Or:
// Causes "MongooseError: Query was already executed" error. This query executes
// twice. Once because of the callback, and once because of `then()`.
Model.updateMany({}, { $inc: { count: 1 } }, function(err) { /* ... */ }).then(() => { ... });
The solution is to skip passing a callback. You don't need callbacks in Mongoose, because Mongoose supports promises and async/await.
await Model.updateMany({}, { $inc: { count: 1 } });
// or
Model.updateMany({}, { $inc: { count: 1 } }).then(() => { ... });
But I want to execute a query twice twice
If you're absolutely sure you want to execute the exact same query twice, you can use clone()
let query = Model.findOne();
await query;
// Throws "MongooseError: Query was already executed" error.
await query;
// Works
await query.clone();
Want to become your team's MongoDB expert? "Mastering Mongoose" distills 8 years of hard-earned
lessons building Mongoose apps at scale into 153 pages. That means you can learn what you need
to know to build production-ready full-stack apps with Node.js and MongoDB in a few days.
Get your copy!
Did you find this tutorial useful? Say thanks by starring our repo on GitHub!