Cast plain object to mongoose document
Posting my own answer so this doesn't stay open:
Version 4 models (stable released on 2015-03-25) now exposes a hydrate()
method. None of the fields will be marked as dirty initially, meaning a call to save()
will do nothing until a field is mutated.
https://github.com/LearnBoost/mongoose/blob/41ea6010c4a84716aec7a5798c7c35ef21aa294f/lib/model.js#L1639-1657
It is very important to note that this is intended to be used to convert a plain JS object loaded from the database into a mongoose document. If you are receiving a document from a REST service or something like that, you should use findById()
and update()
.
For those who live dangerously:
If you really want to update an existing document without touching the database, I suppose you could call hydrate()
, mark fields as dirty, and then call save()
. This is not too different than the method of setting doc.isNew = false;
as I suggested in my original question. However, Valeri (from the mongoose team) suggested not doing this. It could cause validation errors and other edge case issues and generally isn't good practice. findById is really fast and will not be your bottleneck.