Search code examples
mongodbmongodb-querypymongo

Update / replace multiple values MongoDB


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.


Solution

  • 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
    })
    

    Playground link.

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

    Playground link - 2