Menu Docs

Página inicial do DocsDesenvolver aplicaçõesAtlas Device SDKs

Query MongoDB - Java SDK

Nesta página

  • Casos de uso
  • Pré-requisitos
  • Configurar seu projeto
  • Configurar seu projeto
  • Vincular um Cluster de Serviço do Atlas do MongoDB
  • Importar dependências de domínio
  • Instanciar um identificador de coleção do MongoDB
  • Dados de exemplo
  • Criar documentos
  • Inserir um único documento
  • Insira vários documentos
  • Ler documentos
  • Encontrar um único documento
  • Localizar vários documentos
  • Contagem de documentos na coleção
  • Atualize documentos
  • Atualizar um único documento
  • Atualizar vários documentos
  • Documentos do Upsert
  • Exclua documentos
  • Excluir um único documento
  • Excluir vários documentos
  • Fique atento às mudanças
  • Fique atento às mudanças em uma coleção
  • Fique atento às alterações em uma coleção com um filtro
  • Agregar documentos em uma coleção
  • Filtrar documentos
  • Documentos do grupo
  • Campos do documento do projeto
  • Adicionar campos aos documentos
  • Desenrolar valores de array

Você pode executar queries dos dados armazenados no MongoDB Atlas diretamente do código do seu aplicativo Android usando o MongoClient do Realm Java SDK com a API de query. O Atlas App Services fornece regras de acesso a dados em coleções para recuperar resultados com segurança com base no usuário conectado ou no conteúdo de cada documento.

As seguintes ações permitem o acesso a um cluster do MongoDB Atlas vinculado a partir de um aplicativo Android usando o Realm SDK.

Observação

Cada operação descrita nesta página usa uma query para corresponder a determinados documentos na coleção na qual a operação é executada. Quando um filtro corresponde a vários documentos em uma coleção, eles são retornados em uma ordem indeterminada a menos que você especifique um parâmetro de classificação. Isto significa que, se você não especificar uma classificação para as funções findOne(), updateOne() ou deleteOne() , sua operação poderá corresponder a qualquer documento que corresponda à query. Para mais informações sobre classificação, consulte cursor.sort().

Existem várias razões pelas quais você pode querer fazer uma query em uma fonte de dados MongoDB. Trabalhar com dados em seu cliente via Atlas Device Sync nem sempre é prático ou possível. Talvez você queira fazer uma query no MongoDB quando:

  • O conjunto de dados for grande ou o dispositivo cliente tiver restrições para carregar todo o conjunto de dados

  • Você estiver criando ou atualizando dados de usuário personalizados

  • Você estiver recuperando documentos que não sejam modelados no Realm

  • Sua aplicação precisa acessar collections que não têm esquemas rigorosos

  • Um serviço que não é do Realm gera coleções que você deseja acessar

Embora não exaustivos, esses são alguns casos de uso comuns para a query direta do MongoDB.

Antes de poder executar uma query do MongoDB a partir do seu aplicativo Android, você deve configurar o MongoDB Data Access no seu aplicativo App Services. Para saber como configurar seu aplicativo de backend para permitir que o Realm SDK consulte o Atlas, consulte Configurar o acesso aos dados do MongoDB na documentação do App Services.

1

Siga as etapas no guia Instalar o Realm Java SDK .

2

Siga as etapas no guia Vincular uma fonte de dados do MongoDB . Atribua um nome significativo ao seu serviço -- você precisará dele para se conectar ao cluster usando o SDK do Realm.

3

Para operações CRUD em uma coleção MongoDB remota, você usará uma ou mais das seguintes declarações do import :

4

Para se conectar a uma instância do MongoDB, você precisará de um usuário com acesso a uma coleção MongoDB. Faça login em seu aplicativo como usuário e use o código a seguir para instanciar um identificador de coleção MongoDB local.

Observação

Usando classes personalizadas com MongoDB

Para usar classes diferentes da classe Document integrada com o MongoDB, você pode adicionar codecs às suas instâncias MongoCollection . No exemplo acima, adicionamos PojoCodecProvider para suportar objetos Java antigos e simples (POJOs). O suporte a objetos personalizados requer dois fornecedores de codec:

  • o provedor de codec padrão, que fornece suporte para tipos Java integrados (acessados por meio de AppConfiguration.DEFAULT_BSON_CODEC_REGISTRY)

  • PojoCodecProvider, que cria automaticamente novos codecs para dar suporte a classes POJO

O SDK verifica os registros em ordem até que um retorne um codec para a classe solicitada. Como resultado, você deve listar o registro de codec padrão primeiro e o PojoCodecProvider deve sempre ser o último CodecProvider, pois ele pode fornecer um codec para quase qualquer classe.

Os exemplos a seguir operam em uma coleção MongoDB que descreve o inventário em uma cadeia de lojas de plantas. Considere a seguinte coleção de documentos descrevendo várias plantas para venda em uma loja:

Esses trechos de código demonstram como inserir um ou mais documentos em uma coleção MongoDB de um aplicativo móvel. As operações de inserção recebem um documento ou documentos a serem adicionados ao MongoDB como argumento e retornam um RealmResultTask que resulta em um objeto que contém os resultados da execução da operação.

Você pode inserir um único documento usando collection.insertOne().

O trecho a seguir insere um único documento que descreve uma planta "lírio do vale" em uma coleção de documentos que descrevem plantas à venda em um grupo de lojas:

A execução deste trecho produz saída semelhante ao seguinte:

V/EXAMPLE: successfully inserted a document with id: BsonObjectId{value=5f19...}

Você pode inserir vários documentos ao mesmo tempo usando collection.insertMany().

O trecho a seguir insere três documentos descrevendo plantas em uma coleção de documentos que descrevem plantas para venda em um grupo de lojas:

A execução deste trecho produz saída semelhante ao seguinte:

V/EXAMPLE: successfully inserted 3 documents into the collection.

Esses trechos de código demonstram como ler dados armazenados em uma coleção MongoDB de um aplicativo móvel. As operações de leitura usam queries para especificar quais documentos devem ser retornados do banco de dados. As operações de leitura retornam uma tarefa que resulta em um único documento correspondente (no caso de findOne()), um long valor numérico (no caso de count()) ou um iterador que permite percorrer a coleção de documentos correspondentes (no caso de find()).

Você pode encontrar um único documento usando collection.findOne().

O trecho a seguir encontra um único documento de uma coleção de documentos que descrevem plantas para venda em um grupo de lojas onde o campo type do documento da planta contém o valor da string "perennial":

A execução deste trecho produz uma saída semelhante ao seguinte:

V/EXAMPLE: successfully found a document: Plant [id=5f18..., name=venus flytrap, sunlight=full, color=white, type=perennial, partition=Store 42]

Você pode encontrar vários documentos usando collection.find().

O snippet a seguir encontra todos os documentos em uma coleção de documentos que descrevem plantas à venda em um grupo de lojas que contêm um campo chamado _partition com um valor de "Loja 42":

A execução deste trecho produz saída semelhante ao seguinte:

V/EXAMPLE: successfully found all plants for Store 42:
V/EXAMPLE: Plant [id=5f18..., name=venus flytrap, sunlight=full, color=white, type=perennial, partition=Store 42]
V/EXAMPLE: Plant [id=5f18..., name=sweet basil, sunlight=partial, color=green, type=annual, partition=Store 42]
V/EXAMPLE: Plant [id=5f18..., name=thai basil, sunlight=partial, color=green, type=perennial, partition=Store 42]
V/EXAMPLE: Plant [id=5f18..., name=helianthus, sunlight=full, color=yellow, type=annual, partition=Store 42]

Você pode contar documentos em uma coleção usando collection.count(). Você pode especificar uma query opcional para determinar quais documentos contar. Se você não especificar uma query, a ação contará todos os documentos da collection.

O seguinte trecho conta o número de documentos em uma coleção de documentos que descrevem plantas para venda em um grupo de lojas:

A execução deste trecho produz saída semelhante ao seguinte:

V/EXAMPLE: successfully counted, number of documents in the collection: 5

Esses trechos de código demonstram como atualizar os dados armazenados em uma coleção MongoDB de um aplicativo móvel. As operações de atualização usam queries para especificar quais documentos atualizar e atualizar os operadores para descrever como mutar documentos que correspondem à query. Atualizar operações retornam uma Tarefa que se resolve para um objeto que contém os resultados da execução da operação.

Você pode atualizar um único documento usando collection.updateOne().

O trecho a seguir atualiza um único documento em uma coleção de documentos que descrevem plantas para venda em um grupo de lojas. Essa operação consulta um documento em que o campo name contém o valor "petunia" e altera o valor do campo sunlight do primeiro documento correspondente para "parcial":

A execução deste trecho produz saída semelhante ao seguinte:

V/EXAMPLE: successfully updated a document.

Você pode atualizar vários documentos usando collection.updateMany().

O trecho a seguir atualiza vários documentos em uma coleção de documentos que descrevem plantas para venda em um grupo de lojas. Esta operação faz queries em documentos onde o campo _partition contém o valor "Armazenar 47" e altera o valor do campo _partition de cada documento correspondente para "Armazenar 51":

A execução deste trecho produz saída semelhante ao seguinte:

V/EXAMPLE: successfully updated 2 documents.

Se uma operação de atualização não corresponder a nenhum documento na coleção, você poderá inserir automaticamente um único novo documento na coleção que corresponda à query de atualização definindo a opção upsert como true.

O trecho a seguir atualiza um documento em uma coleção de documentos que descrevem plantas para venda em um grupo de lojas ou insere um novo documento se nenhum documento corresponder à query. Esta operação query documentos onde:

  • o campo sunlight tem um valor de "completo"

  • o campo type tem um valor de "perene"

  • o campo color tem um valor de "verde"

  • o campo _partition tem um valor de "Armazenar 47"

Como esse trecho define a opção upsert como true, se nenhum documento corresponder à query, o MongoDB cria um novo documento que inclui a query e as atualizações especificadas:

A execução deste trecho produz saída semelhante ao seguinte:

V/EXAMPLE: successfully upserted a document with id: BsonObjectId{value=5f19...}

Esses trechos de código demonstram como excluir documentos armazenados em uma coleção MongoDB de um aplicativo móvel. As operações de exclusão usam uma query para especificar quais documentos devem ser excluídos e retornam uma tarefa que se resolve para um objeto que contém os resultados da execução da operação.

Você pode excluir um único documento de uma coleção usando collection.deleteOne().

O trecho a seguir exclui um documento em uma coleção de documentos que descrevem plantas para venda em um grupo de lojas. Esta operação consulta um documento onde o campo color tem um valor de "verde" e exclui o primeiro documento que corresponde à consulta:

A execução deste trecho produz saída semelhante ao seguinte:

V/EXAMPLE: successfully deleted a document.

Você pode excluir vários itens de uma coleção usando collection.deleteMany().

O trecho a seguir exclui todos os documentos em uma coleção de documentos que descrevem plantas para venda em um grupo de lojas que correspondem à query que corresponde a documentos contendo um valor de campo sunlight de "completo" e um valor de campo type de "anual ".

A execução deste trecho produz saída semelhante ao seguinte:

V/EXAMPLE: succcessfully deleted 2 documents.

Estes trechos de código demonstram como configurar e executar operações de observação em uma coleção.

Importante

Limitações sem servidor

Você não poderá observar alterações se a fonte de dados for uma instância sem servidor do Atlas. Atualmente, o MongoDB serverless não oferece suporte a fluxos de alterações, que são usados em coleções monitoradas para escutar alterações.

Você pode abrir um fluxo de alterações feitas em uma coleção chamando collection.watch() ou collection.watchAsync(). Você pode observar alterações em documentos específicos em uma coleção passando as IDs de objeto dos objetos que você gostaria de monitorar como um número variável de argumentos.

O seguinte trecho observa alterações em quaisquer documentos na coleção plants :

A execução deste trecho produz saída semelhante ao seguinte:

V/EXAMPLE: successfully inserted a document with id BsonObjectId{value=5f6bb...}
V/EXAMPLE: Event type: INSERT full document: Plant [id=5f6bb..., name=triffid, sunlight=low, color=green, type=perennial, partition=Store 47]

Você pode abrir um fluxo de alterações feitas em documentos em uma coleção que atendam a determinados critérios chamando collection.watchWithFilter() ou collection.watchWithFilterAsync(). Ambos os métodos aceitam um parâmetro Document ou BsonDocument que é utilizado como a query de um operador $match para processar cada evento do banco de dados que ocorre enquanto observa a collection.

O trecho a seguir observa alterações em documentos na coleção plants , mas apenas aciona a chamada de resposta fornecida para eventos correspondentes a documentos pertencentes à partição chamada "Store 42":

A execução deste trecho produz saída semelhante ao seguinte:

V/EXAMPLE: successfully inserted 2 documents into the collection
V/EXAMPLE: Event type: INSERT full document: Plant [id=5f6bb..., name=venomous tentacula, sunlight=low, color=brown, type=annual, partition=Store 42]

As operações de agregação executam todos os documentos em uma coleção por meio de uma série de estágios de agregação de dados chamados de aggregation pipeline. A agregação permite filtrar e transformar documentos, coletar dados resumidos sobre grupos de documentos relacionados e outras operações de dados complexas.

Você pode executar um pipeline de agregação usando collection.aggregate().

Uma operação de aggregation aceita uma lista de estágios de aggregation como entrada e retorna uma Tarefa que resulta em uma coleção de documentos processados pelo pipeline.

Você pode usar o estágio $match para filtrar documentos de acordo com um filtro de query da API de query.

{
"$match": {
"<Field Name>": <Query Expression>,
...
}
}

Exemplo

O seguinte estágio $match filtra os documentos para incluir apenas aqueles em que o campo type tem um valor igual a "perene":

Você pode usar o estágio $group para agregar dados resumidos de um ou mais documentos. O MongoDB agrupa documentos com base na expressão definida no _id valor de campo do $group estágio . Você pode referenciar um campo de documento específico prefixando o nome do campo com um $.

O trecho a seguir agrupa todos os documentos na coleção plants por seu valor type e agrega uma contagem do número de cada tipo:

Você pode usar o estágio $project para incluir ou omitir campos específicos dos documentos. Além disso, você pode calcular novos campos utilizando operadores de aggregation. As projeções funcionam de duas formas:

  • Inclua campos explicitamente com um valor de 1. Isso tem o efeito colateral de excluir implicitamente todos os campos não especificados.

  • Exclua campos de forma implícita com um valor de 0. Isso tem o efeito colateral de incluir implicitamente todos os campos não especificados.

Esses dois métodos de projeção são mutuamente exclusivos: se você incluir campos explicitamente, não poderá excluir campos explicitamente e vice-versa.

Observação

O campo _id é um caso especial: ele é sempre incluído em todas as consultas, a menos que seja explicitamente especificado de outra forma. Por esse motivo, você pode excluir o campo _id com um valor 0 e, ao mesmo tempo, incluir outros campos, como _partition, com um 1. Somente o caso especial de exclusão do campo _id permite tanto a exclusão quanto a inclusão em um estágio $project .

{
"$project": {
"<Field Name>": <0 | 1 | Expression>,
...
}
}

Exemplo

O estágio $project a seguir omite o campo _id, inclui o campo name e cria um novo campo chamado storeNumber. O storeNumber é gerado usando dois operadores de agregação:

  1. $split separa o valor _partition em dois segmentos de string ao redor do caractere de espaço. Por exemplo, o valor "Store 42" dividido dessa forma retorna uma matriz com dois elementos: "Store" e "42".

  2. $arrayElemAt seleciona um elemento específico de uma matriz com base no segundo argumento. Nesse caso, o valor 1 seleciona o segundo elemento da matriz gerada pelo operador $split, já que as matrizes são indexadas a partir de 0. Por exemplo, o valor ["Loja", "42"] passado para esta operação retornaria um valor de "42".

Você pode usar o estágio $addFields para adicionar novos campos com valores calculados usando operadores de aggregation.

Observação

$addFields é semelhante ao $project , mas não permite que você inclua ou omita campos.

Exemplo

O estágio $addFields a seguir cria um novo campo chamado storeNumber em que o valor é a saída de dois operadores agregados que transformam o valor do campo _partition.

Você pode usar o estágio $unwind para transformar um único documento contendo uma matriz em vários documentos contendo valores individuais dessa matriz. Quando você desvincula um campo de array, o MongoDB copia cada documento uma vez para cada elemento do campo de array, mas substitui o valor de array pelo elemento de array em cada cópia.

{
$unwind: {
path: <Array Field Path>,
includeArrayIndex: <string>,
preserveNullAndEmptyArrays: <boolean>
}
}

Exemplo

A etapa $unwind a seguir cria um novo documento para cada elemento da array items em cada documento. Ele também adiciona um campo chamado itemIndex a cada novo documento que especifica o índice de posição do elemento na array original:

Considere o seguinte documento de uma collection de compras:

{
_id: 123,
customerId: 24601,
items: [
{ name: "Baseball", quantity: 5 },
{ name: "Baseball Mitt", quantity: 1 },
{ name: "Baseball Bat", quantity: 1 },
]
}

Se aplicarmos o exemplo do estágio $unwind a este documento, o estágio produzirá os três documentos a seguir:

{
_id: 123,
customerId: 24601,
itemIndex: 0,
items: { name: "Baseball", quantity: 5 }
}, {
_id: 123,
customerId: 24601,
itemIndex: 1,
items: { name: "Baseball Mitt", quantity: 1 }
}, {
_id: 123,
customerId: 24601,
itemIndex: 2,
items: { name: "Baseball Bat", quantity: 1 }
}
← Chamar uma função - SDK Java