Why is the findOneAndUpdate method using findAndModify under the hood instead of findOneAndUpdate?
I need to pass projection settings but it's not working because findAndModifiy doesn't take such parameters, and as such it's returning the entire document.
E.g.:
Product
.findOneAndUpdate({
_id: productId,
}, {
$push: {colors: data},
}, {
projection: {
name: 1, 'colors.$': 1,
},
returnNewDocument: true,
})
Because mongoose's findOneAndUpdate() long predates the existence of findOneAndUpdate() in the underlying mongodb driver, and the driver's findOneAndUpdate() is just a thin wrapper around findAndModify anyway. Also, the driver's findOneAndUpdate() has several quirky semantics, especially related to the new option and the difference between new and returnNewDocument, that are troublesome for mongoose.
Projections not working is a bit of a problem. Try using 'fields' instead of 'projection', because that's the name the underlying findAndModify function uses
Thanks for clarifying. Yes I noticed that there were some odd differences in naming, e.g. fields vs projection and new vs. returnNewDocument.
Yeah there's a little confusion there because every API wants to be it's own special snowflake :) Now that the mongodb driver added a findOneAndUpdate() function that has its own quirks, not quite sure yet with how to proceed on mongoose's fineOneAndUpdate()
Most helpful comment
Yeah there's a little confusion there because every API wants to be it's own special snowflake :) Now that the mongodb driver added a
findOneAndUpdate()function that has its own quirks, not quite sure yet with how to proceed on mongoose's fineOneAndUpdate()