In MongoDB, an upsert is an update query that inserts a new document if no document matches the given filter.
To upsert a document in Mongoose, you need to set the upsert
option to true
in updateOne()
method as shown below:
const mongoose = require('mongoose')
const User = mongoose.model('User', { name: String, email: String })
await User.updateOne(
{
email: 'john@example.com'
},
{
name: 'John Doe',
email: 'john@example.com'
},
{
upsert: true
}
)
To get the upserted document, you need to use the findOneAndUpdate()
function instead:
const user = await User.findOneAndUpdate(
{
email: 'john@example.com'
},
{
name: 'John Doe',
email: 'john@example.com'
},
{
upsert: true,
new: true
}
)
Note that Mongoose will only inert at most one document even if you use updateMany()
with upsert
.
To upsert multiple documents at once, you need to use the bulkWrite()
method as shown below:
const res = await User.bulkWrite([
{
updateOne: {
filter: { email: 'john@exmaple.com' },
update: { name: 'John Doe', email: 'john@exmaple.com' },
upsert: true
}
},
{
updateOne: {
filter: { email: 'alex@exmaple.com' },
update: { name: 'Alex Lee', email: 'alex@exmaple.com' },
upsert: true
}
}
])
res.upsertedCount // Number of upserted documents
✌️ Like this article? Follow me on Twitter and LinkedIn. You can also subscribe to RSS Feed.