Página inicial do Docs → Iniciar e gerenciar o MongoDB → MongoDB Atlas
Como executar pesquisa de query no Atlas Search do utilizando visualizações materializadas
Nesta página
Este tutorial descreve como criar um índice e executar query na collection sample_supplies.sales
do conjunto de dados de amostra e uma nova collection sample_supplies.purchaseOrders
usando uma combinação das seguintes funcionalidades:
Uma visualização materializada on-demand é uma coleção que você cria e atualiza usando um estágio de pipeline de agregação $merge
. Você pode criar um índice do Atlas Search na visualização materializada e, em seguida, executar queries na visualização materializada usando o estágio do pipeline de agregação $search
.
Este tutorial orienta você pelas seguintes etapas:
Crie uma coleção denominada
purchaseOrders
no banco de dadossample_supplies
.Crie uma função do App Services denominada
updateMonthlySales
na UI do App Services para inicializar a visualização materializada domonthlyPhoneTransactions
utilizando dados da coleção de amostra dosample_supplies.sales
em seu Atlas cluster.Crie uma função do App Services denominada
updateMonthlyPurchaseOrders
na interface do usuário do App Services para atualizar a visualização materializada domonthlyPhoneTransactions
utilizando dados da coleção dosample_supplies.purchaseOrders
que você criou no seu Atlas cluster.Agende as seguintes funções para atualizar a visualização materializada do
monthlyPhoneTransactions
periodicamente usando os triggers programados do App Services:updateMonthlySales
updateMonthlyPurchaseOrders
Crie um índice do Atlas Search na visualização materializada
monthlyPhoneTransactions
.Execute uma query na visualização materializada do
monthlyPhoneTransactions
.
Antes de começar, certifique-se de que seu Atlas cluster atenda aos requisitos descritos nos Pré-requisitos.
Para criar um índice do Atlas Search, você deve ter acesso do Project Data Access Admin
ou superior ao projeto.
Para criar uma função e um trigger no App Services, você deve ter acesso Project Owner
ou superior ao projeto.
Crie a coleção purchaseOrders
Conecte ao banco de dados do sample_supplies
.
Abra o
mongosh
em uma janela do terminal e conecte ao seu cluster. Para obter instruções detalhadas sobre a conexão, consulte Conectar viamongosh
.Use o banco de dados do
sample_supplies
:use sample_supplies
Adicionar uma nova collection.
Adicione a coleção purchaseOrders
com novos dados de ordem de compra por telefone de janeiro de 2018. Execute os seguintes comandos:
db.purchaseOrders.insertMany( [ { saleDate: ISODate("2018-01-23T21:06:49.506Z"), items: [ { name: 'printer paper', tags: [ 'office', 'stationary' ], price: Decimal128("40.01"), quantity: 2 }, { name: 'notepad', tags: [ 'office', 'writing', 'school' ], price: Decimal128("35.29"), quantity: 2 }, { name: 'pens', tags: [ 'writing', 'office', 'school', 'stationary' ], price: Decimal128("56.12"), quantity: 5 }, { name: 'backpack', tags: [ 'school', 'travel', 'kids' ], price: Decimal128("77.71"), quantity: 2 }, { name: 'notepad', tags: [ 'office', 'writing', 'school' ], price: Decimal128("18.47"), quantity: 2 }, { name: 'envelopes', tags: [ 'stationary', 'office', 'general' ], price: Decimal128("19.95"), quantity: 8 }, { name: 'envelopes', tags: [ 'stationary', 'office', 'general' ], price: Decimal128("8.08"), quantity: 3 }, { name: 'binder', tags: [ 'school', 'general', 'organization' ], price: Decimal128("14.16"), quantity: 3 } ], storeLocation: 'Denver', customer: { gender: 'M', age: 42, email: 'cauho@witwuta.sv', satisfaction: 4 }, couponUsed: true, purchaseMethod: 'Phone' } ])
db.purchaseOrders.insertMany( [ { saleDate: ISODate("2018-01-25T10:01:02.918Z"), items: [ { name: 'envelopes', tags: [ 'stationary', 'office', 'general' ], price: Decimal128("8.05"), quantity: 10 }, { name: 'binder', tags: [ 'school', 'general', 'organization' ], price: Decimal128("28.31"), quantity: 9 }, { name: 'notepad', tags: [ 'office', 'writing', 'school' ], price: Decimal128("20.95"), quantity: 3 }, { name: 'laptop', tags: [ 'electronics', 'school', 'office' ], price: Decimal128("866.5"), quantity: 4 }, { name: 'notepad', tags: [ 'office', 'writing', 'school' ], price: Decimal128("33.09"), quantity: 4 }, { name: 'printer paper', tags: [ 'office', 'stationary' ], price: Decimal128("37.55"), quantity: 1 }, { name: 'backpack', tags: [ 'school', 'travel', 'kids' ], price: Decimal128("83.28"), quantity: 2 }, { name: 'pens', tags: [ 'writing', 'office', 'school', 'stationary' ], price: Decimal128("42.9"), quantity: 4 }, { name: 'envelopes', tags: [ 'stationary', 'office', 'general' ], price: Decimal128("16.68"), quantity: 2 } ], storeLocation: 'Seattle', customer: { gender: 'M', age: 50, email: 'keecade@hem.uy', satisfaction: 5 }, couponUsed: false, purchaseMethod: 'Phone' } ])
Crie a função updateMonthlySales
Crie a função updateMonthlySales na interface do usuário do Apps Services.
Como funciona a função updateMonthlySales
A função updateMonthlySales
define uma visualização materializada monthlyPhoneTransactions
que contém informações cumulativas de vendas mensais. A função atualiza as informações mensais de vendas para vendas realizadas por telefone.
O exemplo a seguir define a função:
exports = function(){ var pipeline = [ { $match: {purchaseMethod: "Phone"} }, { $unwind: {path: "$items"}}, { $group: { _id: { $dateToString: { format: "%Y-%m", date: "$saleDate" } }, sales_quantity: { $sum: "$items.quantity"}, sales_price: { $sum: "$items.price"} }}, { $set: { sales_price: { $toDouble: "$sales_price"}}}, { $merge: { into: "monthlyPhoneTransactions", whenMatched: "replace" } } ] var monthlyPhoneTransactions = context.services.get("mongodb-atlas").db("sample_supplies").collection("sales"); return monthlyPhoneTransactions.aggregate(pipeline); };
A função utiliza os seguintes estágios do aggregation pipeline para atualizar monthlyPhoneTransactions
:
O estágio
$match
filtra os dados para processar somente as vendas que foram concluídas noPhone
.A etapa
$group
agrupa as informações de vendas por ano-mês. Este estágio gera documentos com o formato:{ "_id" : "<YYYY-mm>", "sales_quantity" : <num>, "sales_amount" : <NumberDecimal> } O estágio
$set
altera o tipo de dados do camposales_price
paradouble
. Os operadores do Atlas Search$search
não suportam o tipo de dadosDecimal128
. Alterar o tipo de dados do camposales_price
permite a você executar uma query deste campo utilizando índices de Atlas Search.O estágio
$merge
escreve o resultado na collectionmonthlyPhoneTransactions
.Com base no campo
_id
(o padrão para coleções de saída não fragmentadas), o estágio verifica se o documento nos resultados da agregação corresponde a um documento existente na coleção:Quando o Atlas Search encontra uma correspondência (ou seja, um documento com o mesmo ano-mês já existe na coleção), o Atlas Search substitui o documento existente pelo documento dos resultados da agregação, conforme especificado no estágio.
Quando o Atlas Search não encontra uma correspondência, o Atlas Search insere o documento dos resultados da agregação na coleção conforme especificado no estágio. Este é o comportamento padrão quando não há correspondência para o campo.
Procedimento
Crie um novo aplicativo.
Para definir uma nova função no servidor a partir da interface do usuário, primeiro você deve criar um aplicativo do App Services:
Se ainda não tiver feito isso, clique na aba App Services .
Criar o aplicativo:
Se você estiver criando seu primeiro aplicativo do App Services no projeto, será exibida a opção de começar sem um modelo (Build your own App). Selecione a opção Build your own App .
Se você já criou pelo menos um App Services App no projeto, clique em Create a New App.
No campo Name , insira
Sales-App
como o nome da função.No campo Link your Database , selecione a opção Use an existing MongoDB Atlas Data Source .
Na lista suspensa, selecione o cluster do Atlas que você criou nos pré- requisitos.
Clique em Create App Service.
Insira o código de função updateMonthlySales
.
Clique na aba Function Editor.
Adicione o código javascript à função
exports
. No mínimo, o código deve atribuir uma função para a variável globalexports
:exports = function(){ var pipeline = [ { $match: {purchaseMethod: "Phone"} }, { $unwind: {path: "$items"}}, { $group: { _id: { $dateToString:{ format: "%Y-%m", date: "$saleDate" } }, sales_quantity: { $sum: "$items.quantity"}, sales_price: { $sum: "$items.price"} } }, { $set: { sales_price: { $toDouble: "$sales_price"}}}, { $merge: { into: "monthlyPhoneTransactions", whenMatched: "replace" } } ] var monthlyPhoneTransactions = context.services.get("mongodb-atlas").db("sample_supplies").collection("sales"); return monthlyPhoneTransactions.aggregate(pipeline); }; Clique no botão Run no canto inferior direito do Function Editor para criar a visualização materializada do
monthlyPhoneTransactions
.A guia Result na parte inferior do Function Editor deve indicar sucesso sem erros.
Clique em Save Draft.
Teste a função.
Abra o
mongosh
em uma janela do terminal e conecte ao seu cluster. Para obter instruções detalhadas sobre a conexão, consulte Conectar viamongosh
.Use o banco de dados do
sample_supplies
:use sample_supplies Consulte a coleção
sales
. Observe que a última venda emsales
ocorre em dezembro de 2017:db.sales.find().sort( {saleDate: -1} ) Confirme que a visualização materializada foi criada em seu banco de dados
sample_supplies
:show collections O comando lista suas collections, incluindo a visualização materializada
monthlyPhoneTransactions
recém-criada.Consulte a visualização materializada do
monthlyPhoneTransactions
:db.monthlyPhoneTransactions.find().sort( { _id: -1} ) A visualização materializada
monthlyPhoneTransactions
mostra os dados recém-adicionados. O resultado principal reflete que a transação mais recente ocorreu em 2017 de dezembro.
Crie a função updateMonthlyPurchaseOrders
Crie a função updateMonthlyPurchaseOrders na IU do App Services.
Como funciona a função updateMonthlyPurchaseOrders
A função updateMonthlyPurchaseOrders
adiciona informações cumulativas da ordem de compra mensal à visualização materializada do monthlyPhoneTransactions
. A função atualiza as informações mensais do pedido de compra para pedidos de compra realizados por telefone.
O exemplo a seguir define a função:
exports = function(){ var pipeline = [ { $match: {purchaseMethod: "Phone"} }, { $unwind: {path: "$items"}}, { $group: { _id: { $dateToString: { format: "%Y-%m", date: "$saleDate" } }, sales_quantity: { $sum: "$items.quantity"}, sales_price: { $sum: "$items.price"} }}, { $set: { sales_price: { $toDouble: "$sales_price"}}}, { $merge: { into: "monthlyPhoneTransactions", whenMatched: "replace" } } ] var monthlyPhoneTransactions = context.services.get("mongodb-atlas").db("sample_supplies").collection("purchaseOrders"); return monthlyPhoneTransactions.aggregate(pipeline); };
A função updateMonthlyPurchaseOrders
utiliza os mesmos estágios do pipeline de agregação para atualizar monthlyPhoneTransactions
como a função updateMonthlySales .
Procedimento
Crie uma nova função para a coleção purchaseOrders
.
Para definir uma nova função do lado do servidor a partir da UI:
Retorne ao seu aplicativo do App Services.
Clique em Functions no menu de navegação esquerdo.
Clique em Create New Function.
Insira
updateMonthlyPurchaseOrders
como o nome da função.Em Authentication, selecione System.
Insira o código de função updateMonthlyPurchaseOrders
Clique na aba Function Editor.
Adicione o código javascript à função
exports
. No mínimo, o código deve atribuir uma função para a variável globalexports
:exports = function(){ var pipeline = [ { $match: {purchaseMethod: "Phone"} }, { $unwind: {path: "$items"}}, { $group: { _id: { $dateToString:{ format: "%Y-%m", date: "$saleDate" } }, sales_quantity: { $sum: "$items.quantity"}, sales_price: { $sum: "$items.price"} } }, { $set: { sales_price: { $toDouble: "$sales_price"}}}, { $merge: { into: "monthlyPhoneTransactions", whenMatched: "replace" } } ] var monthlyPhoneTransactions = context.services.get("mongodb-atlas").db("sample_supplies").collection("purchaseOrders"); return monthlyPhoneTransactions.aggregate(pipeline); }; Clique no botão Run no canto inferior direito do Function Editor para atualizar a visualização materializada do
monthlyPhoneTransactions
.A guia Result na parte inferior do Function Editor deve indicar sucesso sem erros.
A função
updateMonthlyPurchaseOrders
atualiza a visualização materializada domonthlyPhoneTransactions
com os dados da ordem de compra de janeiro 2018 .Clique em Save Draft.
Confirme a atualização.
Retorne ao
mongosh
e faça a query da collectionmonthlyPhoneTransactions
para confirmar a atualização:db.monthlyPhoneTransactions.find().sort( { _id: -1} ) A visualização materializada
monthlyPhoneTransactions
mostra os dados recém-adicionados. O resultado principal reflete que a transação mais recente ocorreu em 2018 de janeiro.
Criar gatilhos programados
Agende as funções do App Services criadas na etapa anterior para serem executadas uma vez por dia a fim de manter a visualização materializada atualizada.
Insira valores de configuração para o Trigger.
Nome do campo UI | Configuração |
---|---|
Trigger Type | Selecione Scheduled. |
Name | Especifique updateMonthlySales . |
Schedule Type |
|
Select An Event Type | Selecione Function. |
Function | Selecione updateMonthlySales . |
Insira valores de configuração para o novo Trigger.
Nome do campo UI | Configuração |
---|---|
Trigger Type | Selecione Scheduled. |
Name | Especifique updateMonthlyPurchaseOrders . |
Schedule Type |
|
Select An Event Type | Selecione Function. |
Function | Selecione updateMonthlyPurchaseOrders . |
Crie um índice do Atlas Search na visualização materializada
Crie um índice do Atlas Search na collection monthlyPhoneTransactions
.
Verifique o status.
O índice recém-criado aparece na aba Atlas Search. Enquanto o índice está construindo, o campo Status lê Build in Progress. Quando o índice terminar de construir, o campo Status lê Active.
Observação
Collections maiores demoram mais tempo para indexar. Você receberá uma notificação por e-mail quando seu índice terminar a criação.
Executar uma query na visualização materializada
Execute uma query na collection monthlyPhoneTransactions
recém-atualizada e indexada.
Conecte-se ao seu cluster em mongosh
.
Abra o mongosh
em uma janela do terminal e conecte ao seu cluster. Para obter instruções detalhadas sobre a conexão, consulte Conectar via mongosh
.
Use o banco de dados do sample_supplies
.
Execute o seguinte comando no prompt mongosh
:
use sample_supplies
Execute query simples do Atlas Search na collection sample_supplies.monthlyPhoneTransactions
.
A query a seguir conta o número de meses em montlyphonetransactions com total de vendas maior ou igual a 10000
dólares:
db.monthlyPhoneTransactions.aggregate([ { $search: { "index": "monthlySalesIndex", "range": { "gt": 10000, "path": ["sales_price"] } } }, { $count: 'months_w_over_10000' }, ])
A query acima retorna 4
, indicando que apenas 4 meses de todos os meses na visualização materializada monthlyPhoneTransactions
tiveram vendas totais maiores ou iguais a 10000 dólares. Este resultado reflete dados das collections sample_supplies.sales
e sample_supplies.purchaseOrders
.
Para obter a documentação completa do aggregation pipeline, consulte o Manual do Servidor MongoDB.