Lägger upp mitt eget svar så att detta inte förblir öppet:
Version 4-modeller (stabil släppt 2015-03-25) visar nu en hydrate()
metod. Inget av fälten kommer att markeras som smutsigt initialt, vilket betyder ett anrop till save()
kommer att göra ingenting förrän ett fält har muterats.
go/LearnBoost /blob/41ea6010c4a84716aec7a5798c7c35ef21aa294f/lib/model.js#L1639-1657
Det är mycket viktigt att notera att detta är avsett att användas för att konvertera ett vanligt JS-objekt som laddats från databasen till ett mongoose-dokument. Om du tar emot ett dokument från en REST-tjänst eller något liknande ska du använda findById()
och update()
.
För dem som lever farligt:
Om du verkligen vill uppdatera ett befintligt dokument utan att röra databasen, antar jag att du kan anropa hydrate()
, markera fält som smutsiga och anropa sedan save()
. Detta är inte alltför annorlunda än metoden för att ställa in doc.isNew = false;
som jag föreslog i min ursprungliga fråga. Valeri (från mongoose-teamet) föreslog dock att inte göra detta. Det kan orsaka valideringsfel och andra problem med kantfall och är generellt sett inte bra. findById är riktigt snabbt och kommer inte att vara din flaskhals.