# How to upsert a document in Mongoose

By Atta Ur Rehman Shah (https://attacomsian.com/about). Published Jul 11, 2022. Topics: Node.js, Mongoose, MongoDB.
Canonical URL: https://attacomsian.com/blog/mongoose-upsert-document

> A quick guide to learning how to upsert a document in Mongoose.

In MongoDB, an upsert is an [update query](https://attacomsian.com/blog/mongoose-update-documents) 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:

```javascript
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:

```javascript
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:

```javascript
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
```
