Skip to content

Update

We will work on the existing Player model.

Let's create some data in the database test_db and a collection player.

# Code omitted above

class Player(Document):
    name: str
    country_code: str
    rating: Optional[int] = None

    class ODMConfig(Document.ODMConfig):
        indexes = [
            IndexModel([("rating", ASCENDING)]),
        ]


def create_players():
    Player(name="Pelé", country_code="BRA", rating=98).create()
    Player(name="Diego Maradona", country_code="ARG", rating=97).create()
    Player(name="Zinedine Zidane", country_code="FRA", rating=94).create()
    Player(name="Ronaldo", country_code="BRA", rating=94).create()
    Player(name="Neymar", country_code="BRA", rating=89).create()
    Player(name="Lionel Messi", country_code="ARG", rating=91).create()
    Player(name="Ángel Di María", country_code="ARG", rating=84).create()
    Player(name="Karim Benzema", country_code="FRA", rating=89).create()
    Player(name="Antoine Griezmann", country_code="FRA", rating=85).create()
    Player(name="Kylian Mbappé", country_code="FRA", rating=91).create()
    Player(name="Gerd Müller", country_code="GER").create()
    Player(name="Miroslav Klose", country_code="GER", rating=91).create()
    Player(name="Thomas Müller", country_code="GER", rating=87).create()
    Player(name="Cristiano Ronaldo", country_code="POR", rating=87).create()
    Player(name="Eusébio", country_code="POR", rating=93).create()
    Player(name="Diogo Jota", country_code="POR", rating=85).create()
    Player(name="David Beckham", country_code="ENG", rating=89).create()
    Player(name="Wayne Rooney", country_code="ENG", rating=80).create()
    Player(name="Harry Kane", country_code="ENG", rating=89).create()

# Code omitted below
Full file preview
import os
from typing import Optional

from mongodb_odm import ASCENDING, Document, IndexModel, apply_indexes, connect


class Player(Document):
    name: str
    country_code: str
    rating: Optional[int] = None

    class ODMConfig(Document.ODMConfig):
        indexes = [
            IndexModel([("rating", ASCENDING)]),
        ]


def create_players():
    Player(name="Pelé", country_code="BRA", rating=98).create()
    Player(name="Diego Maradona", country_code="ARG", rating=97).create()
    Player(name="Zinedine Zidane", country_code="FRA", rating=94).create()
    Player(name="Ronaldo", country_code="BRA", rating=94).create()
    Player(name="Neymar", country_code="BRA", rating=89).create()
    Player(name="Lionel Messi", country_code="ARG", rating=91).create()
    Player(name="Ángel Di María", country_code="ARG", rating=84).create()
    Player(name="Karim Benzema", country_code="FRA", rating=89).create()
    Player(name="Antoine Griezmann", country_code="FRA", rating=85).create()
    Player(name="Kylian Mbappé", country_code="FRA", rating=91).create()
    Player(name="Gerd Müller", country_code="GER").create()
    Player(name="Miroslav Klose", country_code="GER", rating=91).create()
    Player(name="Thomas Müller", country_code="GER", rating=87).create()
    Player(name="Cristiano Ronaldo", country_code="POR", rating=87).create()
    Player(name="Eusébio", country_code="POR", rating=93).create()
    Player(name="Diogo Jota", country_code="POR", rating=85).create()
    Player(name="David Beckham", country_code="ENG", rating=89).create()
    Player(name="Wayne Rooney", country_code="ENG", rating=80).create()
    Player(name="Harry Kane", country_code="ENG", rating=89).create()


def configuration():
    connect(os.environ.get("MONGO_URL", "mongodb://localhost:27017/testdb"))
    apply_indexes()


def update_document():
    player = Player.get(filter={Player.name: "Pelé"})
    player.rating = 97
    player.update()


def update_one_document():
    result = Player.update_one(
        filter={Player.name: "Diego Maradona"}, data={"$set": {Player.rating: 98}}
    )
    print(result.modified_count)


def update_many_document():
    result = Player.update_many(
        filter={Player.rating: 91}, data={"$set": {Player.rating: 92}}
    )
    print(result.modified_count)


def main():
    configuration()
    create_players()

    update_document()
    update_one_document()
    update_many_document()


if __name__ == "__main__":
    main()

Update Document

Let's get one player from the database and update its rating to 97.

# Code omitted above

def update_document():
    player = Player.get(filter={Player.name: "Pelé"})
    player.rating = 97
    player.update()

# Code omitted below
Full file preview
import os
from typing import Optional

from mongodb_odm import ASCENDING, Document, IndexModel, apply_indexes, connect


class Player(Document):
    name: str
    country_code: str
    rating: Optional[int] = None

    class ODMConfig(Document.ODMConfig):
        indexes = [
            IndexModel([("rating", ASCENDING)]),
        ]


def create_players():
    Player(name="Pelé", country_code="BRA", rating=98).create()
    Player(name="Diego Maradona", country_code="ARG", rating=97).create()
    Player(name="Zinedine Zidane", country_code="FRA", rating=94).create()
    Player(name="Ronaldo", country_code="BRA", rating=94).create()
    Player(name="Neymar", country_code="BRA", rating=89).create()
    Player(name="Lionel Messi", country_code="ARG", rating=91).create()
    Player(name="Ángel Di María", country_code="ARG", rating=84).create()
    Player(name="Karim Benzema", country_code="FRA", rating=89).create()
    Player(name="Antoine Griezmann", country_code="FRA", rating=85).create()
    Player(name="Kylian Mbappé", country_code="FRA", rating=91).create()
    Player(name="Gerd Müller", country_code="GER").create()
    Player(name="Miroslav Klose", country_code="GER", rating=91).create()
    Player(name="Thomas Müller", country_code="GER", rating=87).create()
    Player(name="Cristiano Ronaldo", country_code="POR", rating=87).create()
    Player(name="Eusébio", country_code="POR", rating=93).create()
    Player(name="Diogo Jota", country_code="POR", rating=85).create()
    Player(name="David Beckham", country_code="ENG", rating=89).create()
    Player(name="Wayne Rooney", country_code="ENG", rating=80).create()
    Player(name="Harry Kane", country_code="ENG", rating=89).create()


def configuration():
    connect(os.environ.get("MONGO_URL", "mongodb://localhost:27017/testdb"))
    apply_indexes()


def update_document():
    player = Player.get(filter={Player.name: "Pelé"})
    player.rating = 97
    player.update()


def update_one_document():
    result = Player.update_one(
        filter={Player.name: "Diego Maradona"}, data={"$set": {Player.rating: 98}}
    )
    print(result.modified_count)


def update_many_document():
    result = Player.update_many(
        filter={Player.rating: 91}, data={"$set": {Player.rating: 92}}
    )
    print(result.modified_count)


def main():
    configuration()
    create_players()

    update_document()
    update_one_document()
    update_many_document()


if __name__ == "__main__":
    main()

Here first we pull the player document from the database with the name Pelé.

And set his player.rating = None.

Then update the full document by calling player.update().

The method .update() will get all data from the player object and update one document filtered by that player's _id. All data will be updated that is assigned with the model.

Update One Document

In certain scenarios, we need to update a single small number of fields instead of full documents and need to improve the network bandwidth. In that case, or any other case, we need to update one document.

Here we can use the update_one classmethod to update data.

# Code omitted above

def update_one_document():
    result = Player.update_one(
        filter={Player.name: "Diego Maradona"}, data={"$set": {Player.rating: 98}}
    )
    print(result.modified_count)

# Code omitted below
Full file preview
import os
from typing import Optional

from mongodb_odm import ASCENDING, Document, IndexModel, apply_indexes, connect


class Player(Document):
    name: str
    country_code: str
    rating: Optional[int] = None

    class ODMConfig(Document.ODMConfig):
        indexes = [
            IndexModel([("rating", ASCENDING)]),
        ]


def create_players():
    Player(name="Pelé", country_code="BRA", rating=98).create()
    Player(name="Diego Maradona", country_code="ARG", rating=97).create()
    Player(name="Zinedine Zidane", country_code="FRA", rating=94).create()
    Player(name="Ronaldo", country_code="BRA", rating=94).create()
    Player(name="Neymar", country_code="BRA", rating=89).create()
    Player(name="Lionel Messi", country_code="ARG", rating=91).create()
    Player(name="Ángel Di María", country_code="ARG", rating=84).create()
    Player(name="Karim Benzema", country_code="FRA", rating=89).create()
    Player(name="Antoine Griezmann", country_code="FRA", rating=85).create()
    Player(name="Kylian Mbappé", country_code="FRA", rating=91).create()
    Player(name="Gerd Müller", country_code="GER").create()
    Player(name="Miroslav Klose", country_code="GER", rating=91).create()
    Player(name="Thomas Müller", country_code="GER", rating=87).create()
    Player(name="Cristiano Ronaldo", country_code="POR", rating=87).create()
    Player(name="Eusébio", country_code="POR", rating=93).create()
    Player(name="Diogo Jota", country_code="POR", rating=85).create()
    Player(name="David Beckham", country_code="ENG", rating=89).create()
    Player(name="Wayne Rooney", country_code="ENG", rating=80).create()
    Player(name="Harry Kane", country_code="ENG", rating=89).create()


def configuration():
    connect(os.environ.get("MONGO_URL", "mongodb://localhost:27017/testdb"))
    apply_indexes()


def update_document():
    player = Player.get(filter={Player.name: "Pelé"})
    player.rating = 97
    player.update()


def update_one_document():
    result = Player.update_one(
        filter={Player.name: "Diego Maradona"}, data={"$set": {Player.rating: 98}}
    )
    print(result.modified_count)


def update_many_document():
    result = Player.update_many(
        filter={Player.rating: 91}, data={"$set": {Player.rating: 92}}
    )
    print(result.modified_count)


def main():
    configuration()
    create_players()

    update_document()
    update_one_document()
    update_many_document()


if __name__ == "__main__":
    main()

The update_one classmethod accepts the filter object in the first argument with the kwargs filter. It accepts data as the second argument.

A maximum of one document will be updated.

Warning

This function does not validate data with the data model. So make sure you follow the data type that defines in the data model. Otherwise, we will get data validation errors in the future.

Update Many Document

To update multiple documents, we will use the classmethod update_many.

# Code omitted above

def update_many_document():
    result = Player.update_many(
        filter={Player.rating: 91}, data={"$set": {Player.rating: 92}}
    )

# Code omitted below
Full file preview
import os
from typing import Optional

from mongodb_odm import ASCENDING, Document, IndexModel, apply_indexes, connect


class Player(Document):
    name: str
    country_code: str
    rating: Optional[int] = None

    class ODMConfig(Document.ODMConfig):
        indexes = [
            IndexModel([("rating", ASCENDING)]),
        ]


def create_players():
    Player(name="Pelé", country_code="BRA", rating=98).create()
    Player(name="Diego Maradona", country_code="ARG", rating=97).create()
    Player(name="Zinedine Zidane", country_code="FRA", rating=94).create()
    Player(name="Ronaldo", country_code="BRA", rating=94).create()
    Player(name="Neymar", country_code="BRA", rating=89).create()
    Player(name="Lionel Messi", country_code="ARG", rating=91).create()
    Player(name="Ángel Di María", country_code="ARG", rating=84).create()
    Player(name="Karim Benzema", country_code="FRA", rating=89).create()
    Player(name="Antoine Griezmann", country_code="FRA", rating=85).create()
    Player(name="Kylian Mbappé", country_code="FRA", rating=91).create()
    Player(name="Gerd Müller", country_code="GER").create()
    Player(name="Miroslav Klose", country_code="GER", rating=91).create()
    Player(name="Thomas Müller", country_code="GER", rating=87).create()
    Player(name="Cristiano Ronaldo", country_code="POR", rating=87).create()
    Player(name="Eusébio", country_code="POR", rating=93).create()
    Player(name="Diogo Jota", country_code="POR", rating=85).create()
    Player(name="David Beckham", country_code="ENG", rating=89).create()
    Player(name="Wayne Rooney", country_code="ENG", rating=80).create()
    Player(name="Harry Kane", country_code="ENG", rating=89).create()


def configuration():
    connect(os.environ.get("MONGO_URL", "mongodb://localhost:27017/testdb"))
    apply_indexes()


def update_document():
    player = Player.get(filter={Player.name: "Pelé"})
    player.rating = 97
    player.update()


def update_one_document():
    result = Player.update_one(
        filter={Player.name: "Diego Maradona"}, data={"$set": {Player.rating: 98}}
    )
    print(result.modified_count)


def update_many_document():
    result = Player.update_many(
        filter={Player.rating: 91}, data={"$set": {Player.rating: 92}}
    )
    print(result.modified_count)


def main():
    configuration()
    create_players()

    update_document()
    update_one_document()
    update_many_document()


if __name__ == "__main__":
    main()

It accepts the arguments like update_one.

But as the name suggests, it will update multiple documents.

Warning

As with update_one, this function does not validate data with the data model. So make sure you follow the data type that defines in the data model.