MongoDB Upsert add to array

I'm trying to insert/update an array of strings in a mongodb document using some typescript code running in NodeJS. The following code is typescript but I guess JS developers will get it w/o any problems:

export function addEvents(entityId: string, 
                          events: string[] , 
                          callback: () => void) {

   db.collection('events', function(error, eventCollection) {
       if(error) { 
           console.error(error); return; 
       }
       eventCollection.update({ _id: entityId }, { "$pushAll ": 
       { events: events }},
           function(error, result) {
               if(error) { 
                   console.error(error); return; 
               }
               callback();
           });
   });
}

the document have the following structure:

{
    _id : string
    events : ["array","of","strings"]
}

I simply want to append an array strings at the end of the existing array for a specific _id.

I don't quite get if I should use update,save, $push ,$pushall etc.

Can someone explain?

If I understood correctly the problem is that pushAll does nothing or update returns error? Maybe copy-paste mistake in your example but I think you have typo here.

{ "$pushAll ":  { events: events }}

It should be

{ $pushAll: { events: events }}

Your combination of update and $pushAll looks like the best choice for what you're doing here -- it's for appending an array to an existing array. $push is for adding an element to an array. save would involve getting the existing events array, appending to it, then saving the document.

The extra space in "$pushAll " needs to be removed. It may have quotes: "$pushAll".

Found the problem, I needed to pass "{ upsert = true }" as a third argument to the update function.

To achieve 'upsert' semantics in this case, you'd need to use $addToSet. If you have an array of values to add, you'd need to throw in the $each modifier. From mongo shell:

db.events.update(
    { _id: entityId },
    { $addToSet: { $each: events } }
)