Insira documentos
Nesta página
Visão geral
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.
Dados de amostra
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 .
Inserir um documento
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.
Insira vários documentos
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.
Modificar comportamento de inserção
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 |
---|---|
| If set to True , allows the write to opt out of
document-level validation.Defaults to False . |
| An instance of ClientSession . |
| 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 |
---|---|
| 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 . |
Exemplo
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)
Solução de problemas
Anotações do tipo de cliente
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]]
.
Tipo incompatível
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()
.
TypedDict chave _id ausente
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.
Informações adicionais
Para exemplos de código executáveis de inserção de documentos com o PyMongo, consulte Operações CRUD.
Documentação da API
Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API: