'arrayFilters in mongodb
I have the following schema.
{
posts: [
{
_id: '5ayuunbdsyuuuyut778'
replies: [{
_id: "67hfudj7e9whduu888",
text: "something"
}]
}
]
}
I want to update the text in particular reply. I am using mongoose.
I have written the query as follows
Post.findOneAndUpdate(
{'posts.replies._id': _id},
{$set: {'posts.$[post].replies.$[reply].text': "something1"}},
{ arrayFilters: [{'post._id': postId}, { 'reply._id': _id }]}
)
This query is not updating the document.
Am I missing something? Do I need to cast ids using ObjectId
Solution 1:[1]
You need to use new: true to get the updated value and cast id to mongoose objectId to make it work
Post.findOneAndUpdate(
{ 'posts.replies._id': _id },
{ $set: { 'posts.$[post].replies.$[reply].text': "something1" } },
{ arrayFilters: [{ 'post._id': postId }, { 'reply._id': _id }], new: true }
)
Solution 2:[2]
As arrayFilters are something related to mongodb, you need to cast id in mongoose with ObjectId
Post.findOneAndUpdate(
{ 'posts.replies._id': _id },
{ $set: { 'posts.$[post].replies.$[reply].text': "something1" } },
{ arrayFilters: [{ 'post._id': postId }, { 'reply._id': _id }]}
)
must be changed to
Post.findOneAndUpdate(
{ 'posts.replies._id': _id },
{ $set: { 'posts.$[post].replies.$[reply].text': "something1" } },
{ arrayFilters: [{ 'post._id': ObjectId(postId) }, { 'reply._id': ObjectId(_id)}]}
)
Solution 3:[3]
arrayFilters does not accept stringified Object Ids, as opposed to typical filters in mongoose (which cast object ids automatically for you), you must cast object id manually when passing it as filter to arrayFilters).
Post.findOneAndUpdate(
{ 'posts.replies._id': _id },
{ $set: { 'posts.$[post].replies.$[reply].text': "something1" } },
{ arrayFilters: [{ 'post._id':new ObjectId(postId) }, { 'reply._id': new ObjectId(_id) }], new: true }
this will work, check comments here for more details
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | Kodanda Rama Durgarao poluri |
| Solution 3 | WadeeSami |
