Skip to main content

Options nos métodos CRUD do MongoDB Driver C# | MongoDB | Ambiente .NET

  • Options nos métodos CRUD do MongoDB Driver C# | MongoDB | Ambiente .NET

Abaixo está uma doc direta com os principais Options usados nos métodos CRUD do MongoDB Driver C#/.NET. Estou considerando a API atual do driver, onde os métodos CRUD aceitam objetos como InsertOneOptions, FindOptions, UpdateOptions, DeleteOptions, etc. A documentação oficial confirma, por exemplo, que InsertOne() pode receber InsertOneOptions e que Find() pode receber FindOptions para alterar o comportamento da busca. (MongoDB)


Inserir documentos

InsertOneOptions

Usado em:

await collection.InsertOneAsync(documento, options);
PropriedadeTipoPara que serve
BypassDocumentValidationbool?Ignora as validações configuradas na collection, como JSON Schema validator.
CommentBsonValueAdiciona um comentário à operação, útil para profiler, logs e auditoria.

Exemplo:

var options = new InsertOneOptions
{
BypassDocumentValidation = true,
Comment = "Inserindo produto manualmente"
};

await collection.InsertOneAsync(produto, options);

InsertManyOptions

Usado em:

await collection.InsertManyAsync(documentos, options);
PropriedadeTipoPara que serve
BypassDocumentValidationbool?Ignora validações da collection.
CommentBsonValueAdiciona comentário à operação.
IsOrderedboolDefine se os inserts devem ser executados em ordem. Padrão: true.

Exemplo:

var options = new InsertManyOptions
{
IsOrdered = false,
BypassDocumentValidation = true,
Comment = "Carga em lote de produtos"
};

await collection.InsertManyAsync(produtos, options);

A documentação oficial lista BypassDocumentValidation e Comment em InsertOneOptions, e adiciona IsOrdered em InsertManyOptions. (MongoDB)


Buscar documentos

FindOptions<TDocument, TProjection>

Usado em:

await collection.FindAsync(filter, options);
PropriedadeTipoPara que serve
AllowDiskUsebool?Permite uso de disco em operações de ordenação que excedem memória.
AllowPartialResultsbool?Permite retornar resultados parciais em consultas contra sharded cluster se algum shard estiver indisponível.
BatchSizeint?Define o tamanho dos lotes retornados pelo cursor.
CollationCollationDefine regras de comparação de string, como case-insensitive e acentuação.
CommentBsonValueComentário para profiler/logs.
CursorTypeCursorTypeDefine o tipo do cursor, como normal ou tailable cursor.
HintBsonValueForça o uso de um índice específico.
LetBsonDocumentDefine variáveis para uso em expressões da query.
Limitint?Limita a quantidade de documentos retornados.
MaxBsonDocumentDefine limite superior para uso com índice.
MaxAwaitTimeTimeSpan?Tempo máximo de espera para cursor do tipo tailable await.
MaxTimeTimeSpan?Tempo máximo de execução da query no servidor.
MinBsonDocumentDefine limite inferior para uso com índice.
NoCursorTimeoutbool?Impede que o cursor expire automaticamente por inatividade.
ProjectionProjectionDefinition<TDocument, TProjection>Define quais campos retornar.
ReturnKeybool?Retorna apenas os campos do índice utilizado.
ShowRecordIdbool?Retorna o identificador interno do storage engine.
Skipint?Ignora uma quantidade de documentos.
SortSortDefinition<TDocument>Define ordenação.
TranslationOptionsExpressionTranslationOptionsConfigura tradução de expressões LINQ/projeções.

Exemplo:

var options = new FindOptions<Produto, Produto>
{
BatchSize = 100,
Limit = 20,
Sort = Builders<Produto>.Sort.Descending(x => x.Preco),
Collation = new Collation("pt", strength: CollationStrength.Secondary),
Comment = "Busca paginada de produtos ativos"
};

var cursor = await collection.FindAsync(
x => x.Ativo,
options
);

var produtos = await cursor.ToListAsync();

A documentação do driver mostra que Find() recupera documentos por filtro e que seu comportamento pode ser modificado por FindOptions; também lista opções comuns como BatchSize, Collation, Comment, Hint e MaxTime. (MongoDB) A referência da API também lista propriedades herdadas de FindOptionsBase, como AllowDiskUse, BatchSize, Collation, CursorType, Hint, Let, MaxTime, NoCursorTimeout, ReturnKey, ShowRecordId e TranslationOptions. (mongodb.github.io)


Atualizar documentos

UpdateOptions

Usado em:

await collection.UpdateOneAsync(filter, update, options);
await collection.UpdateManyAsync(filter, update, options);
PropriedadeTipoPara que serve
ArrayFiltersIEnumerable<ArrayFilterDefinition>Define filtros para atualizar elementos específicos dentro de arrays.
BypassDocumentValidationbool?Ignora validações da collection.
CollationCollationDefine comparação de string para o filtro.
CommentBsonValueComentário para profiler/logs.
HintBsonValueForça o uso de um índice.
IsUpsertboolSe true, insere um documento caso nenhum seja encontrado.
LetBsonDocumentDefine variáveis para expressões no update.
SortSortDefinition<TDocument>Em update de um único documento, define qual documento atualizar quando vários batem no filtro.

Exemplo com upsert:

var filter = Builders<Produto>.Filter.Eq(x => x.Codigo, "P001");

var update = Builders<Produto>.Update
.Set(x => x.Nome, "Notebook")
.Set(x => x.Ativo, true);

var options = new UpdateOptions
{
IsUpsert = true,
Comment = "Atualização com upsert"
};

await collection.UpdateOneAsync(filter, update, options);

Exemplo com ArrayFilters:

var filter = Builders<Pedido>.Filter.Eq(x => x.Id, pedidoId);

var update = Builders<Pedido>.Update
.Set("Itens.$[item].Quantidade", 10);

var options = new UpdateOptions
{
ArrayFilters = new[]
{
new BsonDocumentArrayFilterDefinition<BsonDocument>(
new BsonDocument("item.Sku", "ABC123")
)
}
};

await collection.UpdateOneAsync(filter, update, options);

A referência da API define UpdateOptions como opções para atualizar um único documento. (mongodb.github.io) As release notes atuais também registram suporte ao uso de sort em operações de update/replace, útil quando vários documentos correspondem ao filtro e você quer controlar qual será afetado. (MongoDB)


Substituir documentos

ReplaceOptions

Usado em:

await collection.ReplaceOneAsync(filter, novoDocumento, options);
PropriedadeTipoPara que serve
BypassDocumentValidationbool?Ignora validações da collection.
CollationCollationDefine regra de comparação para o filtro.
CommentBsonValueComentário para profiler/logs.
HintBsonValueForça uso de índice.
IsUpsertboolInsere o documento se nenhum for encontrado.
LetBsonDocumentDefine variáveis para a operação.
SortSortDefinition<TDocument>Define qual documento substituir quando mais de um corresponder ao filtro, se suportado pela versão do driver/servidor.

Exemplo:

var options = new ReplaceOptions
{
IsUpsert = true,
Comment = "Replace de produto por código"
};

await collection.ReplaceOneAsync(
x => x.Codigo == "P001",
novoProduto,
options
);

A referência da API lista ReplaceOptions com propriedades como BypassDocumentValidation, Collation, Comment, Hint, IsUpsert e Let. (mongodb.github.io)


Deletar documentos

DeleteOptions

Usado em:

await collection.DeleteOneAsync(filter, options);
await collection.DeleteManyAsync(filter, options);
PropriedadeTipoPara que serve
CollationCollationDefine regra de comparação para o filtro.
CommentBsonValueComentário para profiler/logs.
HintBsonValueForça uso de índice.
LetBsonDocumentDefine variáveis para uso na operação.

Exemplo:

var options = new DeleteOptions
{
Collation = new Collation("pt", strength: CollationStrength.Secondary),
Comment = "Removendo produto por nome com collation"
};

await collection.DeleteOneAsync(
x => x.Nome == "notebook",
options
);

A referência da API lista DeleteOptions como opções dos métodos delete e mostra as propriedades Collation, Comment, Hint e Let. (mongodb.github.io)


FindOneAndUpdate, FindOneAndReplace e FindOneAndDelete

Esses métodos fazem uma operação atômica de busca + alteração/remoção e podem retornar o documento antes ou depois da alteração.


FindOneAndUpdateOptions<TDocument, TProjection>

Usado em:

await collection.FindOneAndUpdateAsync(filter, update, options);
PropriedadeTipoPara que serve
ArrayFiltersIEnumerable<ArrayFilterDefinition>Filtros para atualizar elementos específicos de arrays.
BypassDocumentValidationbool?Ignora validações da collection.
CollationCollationDefine regra de comparação.
CommentBsonValueComentário para profiler/logs.
HintBsonValueForça uso de índice.
IsUpsertboolCria o documento se não encontrar nenhum.
LetBsonDocumentDefine variáveis para expressões.
MaxTimeTimeSpan?Tempo máximo de execução.
ProjectionProjectionDefinition<TDocument, TProjection>Define quais campos retornar.
ReturnDocumentReturnDocumentDefine se retorna o documento antes ou depois da alteração.
SortSortDefinition<TDocument>Define qual documento afetar quando vários corresponderem ao filtro.

Exemplo:

var options = new FindOneAndUpdateOptions<Produto>
{
ReturnDocument = ReturnDocument.After,
IsUpsert = false,
Sort = Builders<Produto>.Sort.Descending(x => x.CriadoEm),
Comment = "Atualiza e retorna produto alterado"
};

var produtoAtualizado = await collection.FindOneAndUpdateAsync(
x => x.Categoria == "Eletrônicos",
Builders<Produto>.Update.Inc(x => x.Estoque, -1),
options
);

FindOneAndReplaceOptions<TDocument, TProjection>

Usado em:

await collection.FindOneAndReplaceAsync(filter, replacement, options);
PropriedadeTipoPara que serve
BypassDocumentValidationbool?Ignora validações da collection.
CollationCollationDefine regra de comparação.
CommentBsonValueComentário para profiler/logs.
HintBsonValueForça uso de índice.
IsUpsertboolInsere se não encontrar documento.
LetBsonDocumentDefine variáveis para expressões.
MaxTimeTimeSpan?Tempo máximo de execução.
ProjectionProjectionDefinition<TDocument, TProjection>Define os campos retornados.
ReturnDocumentReturnDocumentRetorna documento antes ou depois do replace.
SortSortDefinition<TDocument>Define qual documento substituir quando vários corresponderem.

Exemplo:

var options = new FindOneAndReplaceOptions<Produto>
{
ReturnDocument = ReturnDocument.After,
IsUpsert = true,
Comment = "Replace atômico de produto"
};

var produto = await collection.FindOneAndReplaceAsync(
x => x.Codigo == "P001",
novoProduto,
options
);

FindOneAndDeleteOptions<TDocument, TProjection>

Usado em:

await collection.FindOneAndDeleteAsync(filter, options);
PropriedadeTipoPara que serve
CollationCollationDefine regra de comparação.
CommentBsonValueComentário para profiler/logs.
HintBsonValueForça uso de índice.
LetBsonDocumentDefine variáveis para expressões.
MaxTimeTimeSpan?Tempo máximo de execução.
ProjectionProjectionDefinition<TDocument, TProjection>Define os campos retornados do documento removido.
SortSortDefinition<TDocument>Define qual documento remover quando vários corresponderem.

Exemplo:

var options = new FindOneAndDeleteOptions<Produto>
{
Sort = Builders<Produto>.Sort.Ascending(x => x.CriadoEm),
Projection = Builders<Produto>.Projection
.Include(x => x.Nome)
.Include(x => x.Preco),
Comment = "Remove produto mais antigo da categoria"
};

var produtoRemovido = await collection.FindOneAndDeleteAsync(
x => x.Categoria == "Promoção",
options
);

Resumo rápido

MétodoClasse de options
InsertOne / InsertOneAsyncInsertOneOptions
InsertMany / InsertManyAsyncInsertManyOptions
Find / FindAsyncFindOptions<TDocument, TProjection>
UpdateOne / UpdateManyUpdateOptions
ReplaceOneReplaceOptions
DeleteOne / DeleteManyDeleteOptions
FindOneAndUpdateFindOneAndUpdateOptions<TDocument, TProjection>
FindOneAndReplaceFindOneAndReplaceOptions<TDocument, TProjection>
FindOneAndDeleteFindOneAndDeleteOptions<TDocument, TProjection>

Exemplo geral

var filter = Builders<Produto>.Filter.Eq(x => x.Codigo, "P001");

var update = Builders<Produto>.Update
.Set(x => x.Nome, "Notebook Gamer")
.Inc(x => x.Estoque, 5);

var options = new UpdateOptions
{
IsUpsert = true,
BypassDocumentValidation = false,
Comment = "Atualização de estoque do produto P001"
};

await collection.UpdateOneAsync(filter, update, options);