I have the following data in MongoDB
{
"BOOK_ID": "100",
"BOOK_NAME": "Book 1",
"BOOK_DESC": "abcd",
"BOOK_AUTH": "150"
},
{
"BOOK_ID": "101",
"BOOK_NAME": "Book 2",
"BOOK_DESC": "efgh",
"BOOK_AUTH": "150"
},
{
"BOOK_ID": "102",
"BOOK_NAME": "Book 3",
"BOOK_DESC": "ijkl",
"BOOK_AUTH": "150"
},
{
"BOOK_ID": "103",
"BOOK_NAME": "Book 13",
"BOOK_DESC": "ijklss",
"BOOK_AUTH": "151"
}
I have a requirement to replace few book names to new names respectively for a particular author, and is as follows:
author_id = 150
changes = [
{'old_name': 'Book 1', 'new_name': 'Book 11'},
{'old_name': 'Book 2', 'new_name': 'Book 22'}
]
I tried to change for one book name, but it doesnt work. The query I tried is as follows:
db.Books.update({
"BOOK_AUTH": "150"
},
[
{
"$set": {
"$replaceOne": {
"input": "$BOOK_NAME",
"find": "Book 1",
"replacement": "Book 11"
}
}
}
])
How to replace multiple items, the following is the expected output:
{
"BOOK_ID": "100",
"BOOK_NAME": "Book 11",
"BOOK_DESC": "abcd",
"BOOK_AUTH": "150"
},
{
"BOOK_ID": "101",
"BOOK_NAME": "Book 22",
"BOOK_DESC": "efgh",
"BOOK_AUTH": "150"
},
{
"BOOK_ID": "102",
"BOOK_NAME": "Book 3",
"BOOK_DESC": "ijkl",
"BOOK_AUTH": "150"
},
{
"BOOK_ID": "103",
"BOOK_NAME": "Book 13",
"BOOK_DESC": "ijklss",
"BOOK_AUTH": "151"
}
Kindly help with replacing multiple values. Thank you.
You don't need to use $replaceOne
, you can simply try this:
db.collection.update({
"BOOK_AUTH": "150",
"BOOK_NAME": {
$in: [
"Book 1",
"Book 2"
]
}
},
[
{
$set: {
BOOK_NAME: {
$cond: {
if: {
$eq: [
"$BOOK_NAME",
"Book 1"
]
},
then: "Book 11",
else: "Book 22"
}
}
}
}
],
{
multi: true
})
For more than two books, use this:
db.collection.update({
"BOOK_AUTH": "150",
"BOOK_NAME": {
$in: [
"Book 1",
"Book 2"
]
}
},
[
{
$set: {
BOOK_NAME: {
$switch: {
branches: [
{
case: {
$eq: [
"$BOOK_NAME",
"Book 1"
]
},
then: "Book 11"
},
{
case: {
$eq: [
"$BOOK_NAME",
"Book 2"
]
},
then: "Book 22"
}
],
default: "$BOOK_NAME"
}
}
}
}
],
{
multi: true
})