Here is the collection:
db.employees.insertMany([
{
"data": {
"category": [
{
"name": "HELLO",
"subcategory": [
"EDUCATION",
"ART",
]
},
{
"name": "HELLO",
"subcategory": [
"GG",
"ART",
]
},
{
"name": "HELLO",
"subcategory": [
"EDUCATION",
"SHORE",
]
}
]
}
},
{
"data": {
"category": [
{
"name": "HELLO",
"subcategory": [
"EDUCATION",
"HELLO",
]
}
]
}
},
{
"data": {
"category": [
{
"name": "HELLO",
"subcategory": [
"GG",
"ART",
]
}
]
}
}
]);
What I want is to locate the elements in ‘category’ with a ‘subcategory’ that contains ‘EDUCATION’ and replace ‘EDUCATION’ with another string, let’s say ‘SPORTS’.
I tried a couple of commands but nothing really did the job:
db.employees.updateMany({
"data.category.subcategory": "EDUCATION"
},
{
"$set": {
"data.category.$": {
"subcategory": "SPORTS"
}
}
})
What I saw is that it doesn’t update the element by replacing it and it doesn’t replace every element that meets the criteria.
2
Answers
Think that MongoDB Update with Aggregation Pipeline fulfills your scenario.
$set
– Setdata.category
value.1.1.
$map
– Iterate each element indata.category
and return an array.1.1.1.
$mergeObjects
– Merge the current document with the document withsubcategory
field from 1.1.1.1.1.1.1.1
$map
– Iterate each value from thesubcategory
array. With$cond
to replace the wordEDUCATION
withSPORTS
if fulfilled, else use existing value ($$this
).Sample Mongo Playground
Here’s another way to do it using
"arrayFilters"
.Try it on mongoplayground.net.