16

I have a document in the following form:

{
"_id" : ObjectId("4d2d8deff4e6c1d71fc29a07"),
"user_id" : "714638ba-2e08-2168-2b99-00002f3d43c0",
"events" : [
        {
                "profile" : 10,
                "data" : "....."
        }
        {
                "profile" : 10,
                "data" : "....."
        }
        {
                "profile" : 20,
                "data" : "....."
        }
        ...
   ]
 }

I'd like to have some sort of upsert statement. It needs to add an event to the events array for user_id in case there is already such doc exist, else it needs to create the doc with the event item.

Can that be done?

SiddAjmera
  • 38,129
  • 5
  • 72
  • 110
LiorH
  • 18,524
  • 17
  • 70
  • 98

1 Answers1

30

You can do upserts in Mongo, see "Upserts with Modifiers" from the Mongo doc:

You may use upsert with a modifier operation. In such a case, the modifiers will be applied to the update criteria member and the resulting object will be inserted.

The query you need will look like:

db.events.update( { "user_id" : "714638ba-2e08-2168-2b99-00002f3d43c0" }, 
{ $push : { "events" : { "profile" : 10, "data" : "X"}}}, {"upsert" : true});
Javier Ferrero
  • 8,741
  • 8
  • 45
  • 50