Reputation: 409
I'm using MongoDB v4.4. My document structure looks like this:
{
_id: ObjectId("..."),
photos: ["image1.png", "image2.png"]
},
{
_id: ObjectId("..."),
photos: ["image3.png", "another_image.png, image5.jpg"]
},
{
_id: ObjectId("..."),
photos: ["image_name.jpg", "image2.jpg"]
},
I am trying to change all the strings that contain ".png" to ".jpg".
I have tried the following:
db.users.updateMany({
photos: { $regex: /.png/ }
}, [{
$set: {
"photos.$[]": {
$replaceOne: {
input: "photos.$[]", find: ".png", replacement: ".jpg"
}
}
}
}])
This returns the error:
MongoServerError: Invalid $set :: caused by :: FieldPath field names may not start with '$'.
Upvotes: 3
Views: 3233
Reputation: 36104
You need to iterate the loop of photos
array and replace the extension,
$map
to iterate loop of photos
array$replaceOne
to replace extensiondb.users.updateMany(
{ photos: { $regex: ".png" } },
[{
$set: {
photos: {
$map: {
input: "$photos",
in: {
$replaceOne: {
input: "$$this",
find: ".png",
replacement: ".jpg"
}
}
}
}
}
}]
)
Upvotes: 7