Menu Docs

Insira documentos

Neste guia, você pode aprender como usar o PyMongo para adicionar documentos a uma coleção MongoDB realizando operações de inserção.

Uma operação de inserção insere um ou mais documentos em uma coleção MongoDB. Você pode executar uma operação de inserção utilizando o método insert_one() ou insert_many() .

Observação

O campo _id deve ser único

Em uma coleção MongoDB , cada documento deve conter um campo _id com um valor único.

Se você especificar um valor para o campo _id, você deverá garantir que o valor seja único na coleção. Se você não especificar um valor, o driver gerará automaticamente um valor ObjectId exclusivo para o campo.

Recomendamos deixar o driver gerar automaticamente valores de _id para garantir exclusividade. Os valores duplicados de _id violam restrições de índice único , o que faz com que o driver retorne um erro.

Os exemplos neste guia usam a collection sample_restaurants.restaurants dos conjuntos de dados de amostra do Atlas. Para saber como criar um cluster MongoDB Atlas gratuito e carregar os conjuntos de dados de amostra, consulte o tutorial Introdução ao PyMongo .

Para adicionar um único documento a uma coleção MongoDB, chame o método insert_one() e passe o documento que você deseja adicionar.

O exemplo a seguir insere um documento na coleção restaurants :

sample_restaurants.restaurants.insert_one({"name" : "Mongo's Burgers"})

Você também pode passar uma instância de uma classe personalizada para o método insert_one(). Isso oferece segurança adicional de tipo se você estiver usando uma ferramenta de verificação de tipo. A instância pela qual você passa deve herdar da classe TypedDict.

Observação

TypedDict no Python 3.7 e anteriores

A classe TypedDict está no módulo typing, disponível somente no Python 3.8 e versões mais recentes. Para usar a TypedDict classe em versões anteriores do Python, instale o pacote digitando_extensions.

O exemplo a seguir passa uma instância da classe Restaurant para o método insert_one() para maior segurança de tipo:

class Restaurant(TypedDict):
name: str
sample_restaurants.restaurants.insert_one(Restaurant(name="Mongo's Burgers")

Dica

Ferramentas de verificação de tipo

Para saber mais sobre as ferramentas de verificação de tipo disponíveis para Python, consulte Verificadores de tipo na página Ferramentas.

Para adicionar vários documentos a uma coleção MongoDB, chame o método insert_many() e passe uma lista de documentos que você deseja adicionar.

O exemplo a seguir insere uma lista de documentos na coleção restaurants :

document_list = [
{ "name" : "Mongo's Burgers" },
{ "name" : "Mongo's Pizza" }
]
sample_restaurants.restaurants.insert_many(document_list)

Você também pode passar uma lista de instâncias de uma classe personalizada para o método insert_many(). Isso oferece segurança adicional de tipo se você estiver usando uma ferramenta de verificação de tipo. As instâncias que você passar devem herdar da classe TypedDict.

Observação

TypedDict no Python 3.7 e anteriores

A classe TypedDict está no módulo typing, que está disponível somente no Python 3.8 e posterior. Para usar a TypedDict classe em versões anteriores do Python, instale o pacote digitando_extensões.

O exemplo seguinte chama o método insert_many() e passa uma lista que contém instâncias da classe Restaurant. Isso adiciona segurança de tipo à operação de inserção.

class Restaurant(TypedDict):
name: str
document_list = [
Restaurant(name="Mongo's Burgers"),
Restaurant(name="Mongo's Pizza")
]
sample_restaurants.restaurants.insert_many(document_list)

Dica

Ferramentas de verificação de tipo

Para saber mais sobre as ferramentas de verificação de tipo disponíveis para Python, consulte Verificadores de tipo na página Ferramentas.

O método insert_one() aceita opcionalmente parâmetros adicionais que representam opções que você pode usar para configurar a operação de inserção. Se você não especificar parâmetros adicionais, o driver não personalizará a inserção.

Propriedade
Descrição

bypass_document_validation

If set to True, allows the write to opt out of document-level validation.
Defaults to False.

session

An instance of ClientSession.

comment

A comment to attach to the operation. For more information, see the insert command fields guide in the MongoDB Server manual for more information.

O método insert_many() aceita os parâmetros opcionais anteriores, bem como a propriedade opcional ordered :

Propriedade
Descrição

ordered

If set to True, the driver sends documents to the server in the order provided. If an error occurs, the driver and server cancel all remaining insert operations.
Defaults to True.

O código a seguir usa o método insert_many() para inserir três novos documentos em uma coleção. Como o segundo argumento do método é bypass_document_validation = True, essa operação de inserção ignora a validação em nível de documento.

document_list = [
{ "name" : "Mongo's Burgers" },
{ "name" : "Mongo's Pizza" },
{ "name" : "Mongo's Tacos" }
]
sample_restaurants.restaurants.insert_many(document_list, bypass_document_validation = True)

Se você não adicionar uma anotação de tipo para seu objeto MongoClient, seu verificador de tipo poderá mostrar um erro semelhante ao seguinte:

from pymongo import MongoClient
client = MongoClient() # error: Need type annotation for "client"

A solução é anotar o objeto MongoClient como client: MongoClient ou client: MongoClient[Dict[str, Any]].

Se você especificar MongoClient como uma dica de tipo, mas não incluir tipos de dados para o documento, as chaves e os valores, seu verificador de tipo poderá mostrar um erro semelhante ao seguinte:

error: Dict entry 0 has incompatible type "str": "int";
expected "Mapping[str, Any]": "int"

A solução é adicionar a seguinte dica de tipo ao seu objeto MongoClient :

``client: MongoClient[Dict[str, Any]]``

Você poderá ver um erro semelhante se passar uma lista para o método insert_one():

error: Argument 1 to "insert_one" of "Collection" has
incompatible type "List[Dict[<nothing>, <nothing>]]";
expected "Mapping[str, Any]"

Este erro ocorre porque o método insert_one() aceita um documento e não uma lista. Você pode resolver esse erro passando um documento para o método insert_one() ou chamando o método insert_many().

Se você não especificar o campo _id, o PyMongo o inserirá automaticamente no documento. Você pode recuperar o valor do campo _id no tempo de execução, mas se usar o MySQL ou outra ferramenta para realizar a verificação estática do tipo, ela não encontrará o campo _id em sua classe e mostrará um erro semelhante ao seguinte:

TypedDict has no key "_id"

Isso é causado por código semelhante ao seguinte:

from typing import TypedDict
from pymongo import MongoClient
from pymongo.collection import Collection
class Movie(TypedDict):
name: str
year: int
client: MongoClient = MongoClient()
collection: Collection[Movie] = client.test.test
inserted = collection.insert_one(Movie(name="Jurassic Park", year=1993))
result = collection.find_one({"name": "Jurassic Park"})
# _id is present but was added by PyMongo; this will raise a type-checking error
assert result["_id"]

Uma solução é adicionar um comentário # type:ignore ao final da linha que usa o campo _id. Este comentário instrui a ferramenta de verificação de tipo a ignorar quaisquer erros que a linha cause. O exemplo a seguir mostra como implementar esta solução;

from typing import TypedDict
from pymongo import MongoClient
from pymongo.collection import Collection
class Movie(TypedDict):
name: str
year: int
collection: Collection[Movie] = client.test.test
inserted = collection.insert_one(
Movie(name="Jurassic Park", year=1993)
)
result = collection.find_one({"name": "Jurassic Park"})
assert result is not None
assert result["_id"] # type:ignore[typeddict-item]

Em vez de ignorar o erro de tipo, você pode evitá-lo incluindo o campo _id na classe de modelo e especificando explicitamente um valor para esse campo ao criar a instância de classe . O seguinte código mostra como implementar esta solução:

from typing import TypedDict
from pymongo import MongoClient
from pymongo.collection import Collection
from bson import ObjectId
class Movie(TypedDict):
_id: ObjectId
name: str
year: int
collection: Collection[ExplicitMovie] = client.test.test
inserted = collection.insert_one(
ExplicitMovie(_id=ObjectId(), name="Jurassic Park", year=1993)
)
result = collection.find_one({"name": "Jurassic Park"})
assert result is not None
assert result["_id"]

Uma desvantagem de adicionar o campo _id à sua classe personalizada é que você deve incluir um valor para o campo para cada instância da classe que criar. Para evitar isso, você pode instalar o pacote typing.NotRequired , que inclui a dica de tipo NotRequired . Se você usar essa dica de tipo para o campo _id , poderá acessar o valor do campo _id no tempo de execução sem ver nenhum erro de tipo em tempo de compilação.

O seguinte exemplo de código mostra como implementar esta solução:

from typing import TypedDict, NotRequired
from pymongo import MongoClient
from pymongo.collection import Collection
from bson import ObjectId
class Movie(TypedDict):
_id: NotRequired[ObjectId]
name: str
year: int
client: MongoClient = MongoClient()
collection: Collection[Movie] = client.test.test
inserted = collection.insert_one(Movie(name="Jurassic Park", year=1993))
result = collection.find_one({"name": "Jurassic Park"})
assert result is not None
assert result["_id"]

Importante

NotRequired requer Python 3.11+

A classe NotRequired está disponível somente no Python 3.11 e posterior. Para usar NotRequired em versões anteriores do Python, instale o pacote digitando_extensões.

Para exemplos de código executáveis de inserção de documentos com o PyMongo, consulte Operações CRUD.

Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API: