update modifies an existing document found by your search parameters and does nothing when such a document does not exist (unless you use the upsert parameter).
save does not allow to find search parameters. It checks for a document with the same _id as the one you are saving. When it exists, it replaces it. When there is no such document, it inserts the document as new. When the document you are _id does not have a _id field, it generates one with the newly created ObjectId before pasting.
collection.save(document); is basically a shorthand for:
if (document._id == undefined) { document._id = new ObjectId(); } collection.update({ "_id":document._id }, document, { upsert:true });
source share