Check if MongoDB upsert did an insert or an update

Mongodb

Mongodb Problem Overview


I can't find this in the documentation in any of the obvious places. I'd like to know if it is possible to know if Mongo executed an insert or update in the upsert operation?

Mongodb Solutions


Solution 1 - Mongodb

Yes there is, on a safe call (or getLastError) the update function will return an array with an upsert field and a updatedExisting field.

You can read the PHP version of this here: http://php.net/manual/en/mongocollection.insert.php towards the bottom.

As it says within the documentation on upserted:

> If an upsert occured, this field will contain the new record's _id field. For upserts, either this field or updatedExisting will be present (unless an error occurred).

So upserted contains the _id of the new record if a insert was done or it will increment updatedExisting if it updated a record.

I am sure a similar thing appears in all drivers.

Edit

It will actually be a boolean in the updatedExisting field of true or false

Solution 2 - Mongodb

For reference only, in node.js:

collection.update( source, target, { upsert: true }, function(err, result, upserted) {
  ...
});

Solution 3 - Mongodb

For reference only, in node.js using Mongoose 3.6:

model.update( findquery, updatequery, { upsert: true }, function(err, numberAffected, rawResponse) {
  ...
});

Where rawResponse looks like this when it has updated an existing document:

{ updatedExisting: true,
  n: 1,
  connectionId: 222,
  err: null,
  ok: 1 }

And it looks like this when it has created a new document:

{ updatedExisting: false,
  upserted: 51eebc080eb3e2208a630d8e,
  n: 1,
  connectionId: 222,
  err: null,

(Both cases would return numberAffected = 1)

Solution 4 - Mongodb

The Answer was taken from "MongoDB Applied Design Patterns" Book determine whether an upsert was an insert
or an update

Solution 5 - Mongodb

Using MongoDB driver 3.5.9 under Node.js, I found that there are these properties we are interested in after using updateOne with { upsert: true }:

{
  modifiedCount: 0,
  upsertedId: null,
  upsertedCount: 0,
  matchedCount: 1
}

When upsert inserted something, we will get upsertedCount > 0 and upsertedId will hold the newly inserted document ID. When upsert modified something, we will get modifiedCount > 0.

The tutorial for all CRUD operations is here https://mongodb.github.io/node-mongodb-native/3.6/tutorials/crud/

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser56250View Question on Stackoverflow
Solution 1 - MongodbSammayeView Answer on Stackoverflow
Solution 2 - Mongodbuser56250View Answer on Stackoverflow
Solution 3 - MongodbsuperiggyView Answer on Stackoverflow
Solution 4 - MongodbAssem-HafezView Answer on Stackoverflow
Solution 5 - MongodbAlex KView Answer on Stackoverflow