Menu Docs
Página inicial do Docs
/ /
Atlas Device SDKs
/

Consulta MongoDB - Web SDK

Nesta página

  • 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
  • Documentos agregados
  • Agregar documentos em uma coleção
  • Estágios de aggregation
  • Filtrar documentos
  • Documentos do grupo
  • Paginar documentos
  • Campos do documento do projeto
  • Adicionar campos aos documentos
  • Unwind Array Values

Você pode executar uma query dos dados armazenados no MongoDB Atlas diretamente do código do seu aplicação cliente usando Realm Web SDK MongoDB o cliente do com a Query API. 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 ações seguintes permitem a você executar uma query de um cluster do MongoDB Atlas vinculado a partir de um aplicativo da web utilizando o Realm SDK da Web.

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().

Antes de poder executar uma query do MongoDB a partir do seu aplicativo da web, você deve configurar o MongoDB Data Access no seu App Services App. 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 Atlas App Services .

1

Siga as etapas no guia Instalar o Realm para Web.

2

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

3

Na parte superior dos arquivos de origem onde você deseja usar Realm, adicione o código a seguir para importar o SDK e o construtor BSON ObjectId.

import * as Realm from "realm-web";
const {
BSON: { ObjectId },
} = Realm;
4

Para acessar uma coleção, crie o identificador de serviço MongoDB para o usuário com o qual você deseja acessar a coleção:

const mongo = app.currentUser.mongoClient(DATA_SOURCE_NAME);
const collection = mongo.db(DATABASE_NAME).collection(COLLECTION_NAME);

Os exemplos nesta página usam a seguinte coleção MongoDB que descreve várias plantas para venda em uma cadeia de lojas de plantas:

{
_id: ObjectId("5f87976b7b800b285345a8b4"),
name: "venus flytrap",
sunlight: "full",
color: "white",
type: "perennial",
_partition: "Store 42",
},
{
_id: ObjectId("5f87976b7b800b285345a8b5"),
name: "sweet basil",
sunlight: "partial",
color: "green",
type: "annual",
_partition: "Store 42",
},
{
_id: ObjectId("5f87976b7b800b285345a8b6"),
name: "thai basil",
sunlight: "partial",
color: "green",
type: "perennial",
_partition: "Store 42",
},
{
_id: ObjectId("5f87976b7b800b285345a8b7"),
name: "helianthus",
sunlight: "full",
color: "yellow",
type: "annual",
_partition: "Store 42",
},
{
_id: ObjectId("5f87976b7b800b285345a8b8"),
name: "petunia",
sunlight: "full",
color: "purple",
type: "annual",
_partition: "Store 47",
},

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

Você pode inserir um único documento chamando 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:

const result = await plants.insertOne({
name: "lily of the valley",
sunlight: "full",
color: "white",
type: "perennial",
_partition: "Store 47",
});
console.log(result);

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

{ insertedId: ObjectId("5f879f83fc9013565c23360e") }

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:

const result = await plants.insertMany([
{
name: "rhubarb",
sunlight: "full",
color: "red",
type: "perennial",
_partition: "Store 47",
},
{
name: "wisteria lilac",
sunlight: "partial",
color: "purple",
type: "perennial",
_partition: "Store 42",
},
{
name: "daffodil",
sunlight: "full",
color: "yellow",
type: "perennial",
_partition: "Store 42",
},
]);
console.log(result);

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

{
insertedIds: [
ObjectId("5f87a0defc9013565c233611"),
ObjectId("5f87a0defc9013565c233612"),
ObjectId("5f87a0defc9013565c233613"),
],
}

Esses trechos de código demonstram como ler dados armazenados em uma coleção MongoDB de um aplicação móvel. As operações de leitura usam filtros de query para especificar quais documentos devem ser retornados do banco de banco de dados. As operações de leitura retornam uma Promise que resulta em uma das seguintes opções: um único documento correspondente (no caso de findOne()), um valor numérico (no caso de count()) ou uma array de documentos correspondentes (no caso de find()).

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

O trecho a seguir encontra o documento que descreve as armadilhas de vênus na coleção de documentos que descrevem plantas à venda em um grupo de lojas:

const venusFlytrap = await plants.findOne({ name: "venus flytrap" });
console.log("venusFlytrap", venusFlytrap);

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

{
_id: ObjectId("5f87976b7b800b285345a8b4"),
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 type com um valor de "perennial":

const perennials = await plants.find({ type: "perennial" });
console.log("perennials", perennials);

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

[
{
_id: ObjectId("5f87976b7b800b285345a8b4"),
name: "venus flytrap",
sunlight: "full",
color: "white",
type: "perennial",
_partition: "Store 42",
},
{
_id: ObjectId("5f87976b7b800b285345a8b6"),
name: "thai basil",
sunlight: "partial",
color: "green",
type: "perennial",
_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 coleção.

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:

const numPlants = await plants.count();
console.log(`There are ${numPlants} plants in the collection`);

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

"There are 5 plants in the collection"

Esses trechos de código demonstram como atualizar os dados armazenados em uma coleção MongoDB de um aplicação 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. As operações de atualização retornam uma Promise 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":

const result = await plants.updateOne(
{ name: "petunia" },
{ $set: { sunlight: "partial" } }
);
console.log(result);

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

{ matchedCount: 1, modifiedCount: 1 }

Você pode atualizar um único documento 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 42" e altera o valor do campo _partition de cada documento correspondente para "Armazenar 51":

const result = await plants.updateMany(
{ _partition: "Store 42" },
{ $set: { _partition: "Store 51" } }
);
console.log(result);

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

{ matchedCount: 4, modifiedCount: 4 }

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:

const result = await plants.updateOne(
{
sunlight: "full",
type: "perennial",
color: "green",
_partition: "Store 47",
},
{ $set: { name: "super sweet basil" } },
{ upsert: true }
);
console.log(result);

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

{
matchedCount: 0,
modifiedCount: 0,
upsertedId: ObjectId("5f1f63055512f2cb67f460a3"),
}

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 Promessa 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:

const result = await plants.deleteOne({ color: "green" });
console.log(result);

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

{ deletedCount: 1 }

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

O snippet a seguir exclui todos os documentos para plantas que estão em "Loja 42" em uma coleção de documentos que descrevem plantas para venda em um grupo de lojas:

const result = await plants.deleteMany({
_partition: "Store 42",
});
console.log(result);

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

{ deletedCount: 4 }

Você pode chamar collection.watch() para se inscrever aos eventos de notificação em tempo real sempre que um documento da coleção for adicionado, modificado ou excluído. Cada notificação especifica um documento que foi alterado, como ele foi alterado e o documento completo após a operação que causou o evento.

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.

O Atlas App Services usa fluxos de alterações do MongoDB em coleções assistidas para ouvir alterações e transmitir notificações para aplicativos clientes inscritos. Isso é útil para casos em que você deseja saber quando algo aconteceu enquanto um usuário está online. Por exemplo:

  • Rastreie a localização de uma entrega

  • Obtenha as pontuações e estatísticas mais atualizadas de um jogo

  • Atualizar uma conversa de bate-papo quando um usuário envia uma nova mensagem

Observação

collection.watch() retorna um gerador assíncrono que permite que você extraia de forma assíncrona eventos de alteração para operações à medida que ocorrem.

Para observar todas as mudanças em uma coleção, chame collection.watch() sem argumentos:

for await (const change of plants.watch()) {
let breakAsyncIterator = false; // Later used to exit async iterator
switch (change.operationType) {
case "insert": {
const { documentKey, fullDocument } = change;
console.log(`new document: ${documentKey}`, fullDocument);
breakAsyncIterator = true;
break;
}
case "update": {
const { documentKey, fullDocument } = change;
console.log(`updated document: ${documentKey}`, fullDocument);
breakAsyncIterator = true;
break;
}
case "replace": {
const { documentKey, fullDocument } = change;
console.log(`replaced document: ${documentKey}`, fullDocument);
breakAsyncIterator = true;
break;
}
case "delete": {
const { documentKey } = change;
console.log(`deleted document: ${documentKey}`);
breakAsyncIterator = true;
break;
}
}
if (breakAsyncIterator) break; // Exit async iterator
}

Para observar alterações específicas em uma coleção, chame collection.watch() com uma query que especifique os valores de eventos de alteração a serem observados:

for await (const change of plants.watch({
filter: {
operationType: "update",
"fullDocument.type": "perennial",
},
})) {
// The change event will always represent a newly inserted perennial
const { documentKey, fullDocument } = change;
console.log(`new document: ${documentKey}`, fullDocument);
break; // Exit async iterator
}

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

As operações de agregação aceitam uma lista de estágios de agregação como entrada e retornam uma Promise que resulta em uma coleção de documentos processados pelo pipeline.

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

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:

const result = await plants.aggregate([
{
$group: {
_id: "$type",
total: { $sum: 1 },
},
},
{ $sort: { _id: 1 } },
]);
console.log(result);

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

[
{ _id: "annual", total: 3 },
{ _id: "perennial", total: 2 },
]

Você pode utilizar o estágio $match para filtrar documentos de acordo com a sintaxe da query padrão do MongoDB.

{
"$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":

const perennials = await plants.aggregate([
{ $match: { type: { $eq: "perennial" } } },
]);
console.log(perennials);
[
{ "_id": ObjectId("5f87976b7b800b285345a8c4"), "_partition": "Store 42", "color": "white", "name": "venus flytrap", "sunlight": "full", "type": "perennial" },
{ "_id": ObjectId("5f87976b7b800b285345a8c6"), "_partition": "Store 42", "color": "green", "name": "thai basil", "sunlight": "partial", "type": "perennial" },
{ "_id": ObjectId("5f87a0dffc9013565c233612"), "_partition": "Store 42", "color": "purple", "name": "wisteria lilac", "sunlight": "partial", "type": "perennial" },
{ "_id": ObjectId("5f87a0dffc9013565c233613"), "_partition": "Store 42", "color": "yellow", "name": "daffodil", "sunlight": "full", "type": "perennial" },
{ "_id": ObjectId("5f1f63055512f2cb67f460a3"), "_partition": "Store 47", "color": "green", "name": "sweet basil", "sunlight": "full", "type": "perennial" }
]

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 campo _id da etapa $group . Você pode referenciar um campo de documento específico prefixando o nome do campo com um $.

{
"$group": {
"_id": <Group By Expression>,
"<Field Name>": <Aggregation Expression>,
...
}
}

Exemplo

A etapa $group a seguir organiza documentos pelo valor de seu campo type e calcula o número de documentos da planta em que cada valor type exclusivo aparece.

const result = await plants.aggregate([
{
$group: {
_id: "$type",
numItems: { $sum: 1 },
},
},
{ $sort: { _id: 1 } },
]);
console.log(result);
[
{ _id: "annual", numItems: 1 },
{ _id: "perennial", numItems: 5 },
]

Para paginar resultados, você pode utilizar consultas de agregação de intervalo com os operadores $match, $sort e $limit. Para saber mais sobre a paginação de documentos, consulte Usando consultas de intervalo na documentação do MongoDB Server.

Exemplo

O exemplo a seguir pagina em ordem crescente por meio de uma coleção de documentos.

// Paginates through list of plants
// in ascending order by plant name (A -> Z)
async function paginateCollectionAscending(
collection,
nPerPage,
startValue
) {
const pipeline = [{ $sort: { name: 1 } }, { $limit: nPerPage }];
// If not starting from the beginning of the collection,
// only match documents greater than the previous greatest value.
if (startValue !== undefined) {
pipeline.unshift({
$match: {
name: { $gt: startValue },
},
});
}
const results = await collection.aggregate(pipeline);
return results;
}
// Number of results to show on each page
const resultsPerPage = 3;
const pageOneResults = await paginateCollectionAscending(
plants,
resultsPerPage
);
const pageTwoStartValue = pageOneResults[pageOneResults.length - 1].name;
const pageTwoResults = await paginateCollectionAscending(
plants,
resultsPerPage,
pageTwoStartValue
);
// ... can keep paginating for as many plants as there are in the collection

Você pode utilizar o estágio $project para incluir ou omitir campos específicos de documentos ou calcular novos campos utilizando operadores de agregação. 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".

const result = await plants.aggregate([
{
$project: {
_id: 0,
name: 1,
storeNumber: {
$arrayElemAt: [{ $split: ["$_partition", " "] }, 1],
},
},
},
]);
console.log(result);
[
{ "name": "venus flytrap", "storeNumber": "42" },
{ "name": "thai basil", "storeNumber": "42" },
{ "name": "helianthus", "storeNumber": "42" },
{ "name": "wisteria lilac", "storeNumber": "42" },
{ "name": "daffodil", "storeNumber": "42" },
{ "name": "sweet basil", "storeNumber": "47" }
]

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

{ $addFields: { <newField>: <expression>, ... } }

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.

const result = await plants.aggregate([
{
$addFields: {
storeNumber: {
$arrayElemAt: [{ $split: ["$_partition", " "] }, 1],
},
},
},
]);
console.log(result);
[
{ "_id": ObjectId("5f87976b7b800b285345a8c4"), "_partition": "Store 42", "color": "white", "name": "venus flytrap", "storeNumber": "42", "sunlight": "full", "type": "perennial" },
{ "_id": ObjectId("5f87976b7b800b285345a8c6"), "_partition": "Store 42", "color": "green", "name": "thai basil", "storeNumber": "42", "sunlight": "partial", "type": "perennial" },
{ "_id": ObjectId("5f87976b7b800b285345a8c7"), "_partition": "Store 42", "color": "yellow", "name": "helianthus", "storeNumber": "42", "sunlight": "full", "type": "annual" },
{ "_id": ObjectId("5f87a0dffc9013565c233612"), "_partition": "Store 42", "color": "purple", "name": "wisteria lilac", "storeNumber": "42", "sunlight": "partial", "type": "perennial" },
{ "_id": ObjectId("5f87a0dffc9013565c233613"), "_partition": "Store 42", "color": "yellow", "name": "daffodil", "storeNumber": "42", "sunlight": "full", "type": "perennial" },
{ "_id": ObjectId("5f1f63055512f2cb67f460a3"), "_partition": "Store 47", "color": "green", "name": "sweet basil", "storeNumber": "47", "sunlight": "full", "type": "perennial" }
]

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ê desenrola um campo de matriz, o MongoDB copia cada documento uma vez para cada elemento do campo de matriz, mas substitui o valor da matriz pelo elemento da matriz em cada cópia.

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

Exemplo

O exemplo a seguir usa o estágio $unwind para a combinação type e color de cada objeto. O pipeline de agregação tem as seguintes etapas:

  1. Use a etapa $group com $addToSet para criar novos documentos para cada type com um novo campo colors que contenha uma matriz de todas as cores desse tipo de flor que ocorrem na coleção.

  2. Use o estágio $unwind para criar documentos separados para cada combinação de tipo e cor.

  3. Use o estágio $sort para classificar os resultados em ordem alfabética.

const result = await plants.aggregate([
{ $group: { _id: "$type", colors: { $addToSet: "$color" } } },
{ $unwind: { path: "$colors" } },
{ $sort: { _id: 1, colors: 1 } },
]);
console.log(result);
[
{ "_id": "annual", "colors": "yellow" },
{ "_id": "perennial", "colors": "green" },
{ "_id": "perennial", "colors": "purple" },
{ "_id": "perennial", "colors": "white" },
{ "_id": "perennial", "colors": "yellow" },
]

Voltar

Criar e gerenciar chaves de API do usuário