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()