Menu Docs

Página inicial do DocsIniciar e gerenciar o MongoDBMongoDB Atlas

Como executar pesquisa de query no Atlas Search do utilizando visualizações materializadas

Nesta página

  • Criar a coleção purchaseOrders
  • Crie a função updateMonthlySales
  • Crie a função updateMonthlyPurchaseOrders
  • Criar gatilhos programados
  • Crie um índice do Atlas Search na visualização materializada
  • Executar uma query na visualização materializada

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:

  • visualizações materializadas on-demand

  • Triggers programados do Atlas App Services

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:

  1. Crie uma coleção denominada purchaseOrders no banco de dados sample_supplies .

  2. Crie uma função do App Services denominada updateMonthlySales na UI do App Services para inicializar a visualização materializada do monthlyPhoneTransactions utilizando dados da coleção de amostra do sample_supplies.sales em seu Atlas cluster.

  3. Crie uma função do App Services denominada updateMonthlyPurchaseOrders na interface do usuário do App Services para atualizar a visualização materializada do monthlyPhoneTransactions utilizando dados da coleção do sample_supplies.purchaseOrders que você criou no seu Atlas cluster.

  4. Agende as seguintes funções para atualizar a visualização materializada do monthlyPhoneTransactions periodicamente usando os triggers programados do App Services:

    1. updateMonthlySales

    2. updateMonthlyPurchaseOrders

  5. Crie um índice do Atlas Search na visualização materializada monthlyPhoneTransactions .

  6. 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.

1
  1. 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.

  2. Use o banco de dados do sample_supplies :

    use sample_supplies
2

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'
}
])
3

Consulte a coleção purchaseOrders para confirmar as novas entradas de ordem de compra.

db.purchaseOrders.find().sort( {saleDate: -1} )

Os dois resultados da query refletem que os dados da ordem de compra terminam em janeiro de 2018.

Crie a função updateMonthlySales na interface do usuário do Apps Services.

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 no Phone.

  • 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 campo sales_price para double. Os operadores do Atlas Search $search não suportam o tipo de dados Decimal128 . Alterar o tipo de dados do campo sales_price permite a você executar uma query deste campo utilizando índices de Atlas Search.

  • O estágio $merge escreve o resultado na collection monthlyPhoneTransactions .

    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.

1

Para definir uma nova função no servidor a partir da interface do usuário, primeiro você deve criar um aplicativo do App Services:

  1. Se ainda não tiver feito isso, clique na aba App Services .

  2. 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.

  3. No campo Name , insira Sales-App como o nome da função.

  4. No campo Link your Database , selecione a opção Use an existing MongoDB Atlas Data Source .

  5. Na lista suspensa, selecione o cluster do Atlas que você criou nos pré- requisitos.

  6. Clique em Create App Service.

2

Para definir uma nova função do lado do servidor a partir da UI:

  1. Clique em Functions no menu de navegação esquerdo.

  2. Clique em Create New Function.

  3. Insira updateMonthlySales como o nome da função.

  4. Em Authentication, selecione System.

3
  1. Clique na aba Function Editor.

  2. Adicione o código javascript à função exports . No mínimo, o código deve atribuir uma função para a variável global exports:

    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);
    };
  3. 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.

  4. Clique em Save Draft.

4
  1. 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.

  2. Use o banco de dados do sample_supplies :

    use sample_supplies
  3. Consulte a coleção sales . Observe que a última venda em sales ocorre em dezembro de 2017:

    db.sales.find().sort( {saleDate: -1} )
  4. 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.

  5. 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 na IU do App Services.

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 .

1

Para definir uma nova função do lado do servidor a partir da UI:

  1. Retorne ao seu aplicativo do App Services.

  2. Clique em Functions no menu de navegação esquerdo.

  3. Clique em Create New Function.

  4. Insira updateMonthlyPurchaseOrders como o nome da função.

  5. Em Authentication, selecione System.

2
  1. Clique na aba Function Editor.

  2. Adicione o código javascript à função exports . No mínimo, o código deve atribuir uma função para a variável global exports:

    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);
    };
  3. 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 do monthlyPhoneTransactions com os dados da ordem de compra de janeiro 2018 .

  4. Clique em Save Draft.

3
  1. Retorne ao mongosh e faça a query da collection monthlyPhoneTransactions 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.

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.

1
2
3
Nome do campo UI
Configuração
Trigger Type
Selecione Scheduled.
Name
Especifique updateMonthlySales.
Schedule Type
  1. Selecione Basic.

  2. Para Repeat once by, selecione Day of the Month e defina o valor para a data de sua preferência.

    Observação

    Como alternativa, para fins de teste, defina o menu suspenso Repeat once by para uma ocorrência mais frequente, como Minute ou Hour

Select An Event Type
Selecione Function.
Function
Selecione updateMonthlySales.
4
5
6
7
Nome do campo UI
Configuração
Trigger Type
Selecione Scheduled.
Name
Especifique updateMonthlyPurchaseOrders.
Schedule Type
  1. Selecione Basic.

  2. Para Repeat once by, selecione Day of the Month e defina o valor para a data de sua preferência.

    Observação

    Como alternativa, para fins de teste, defina o menu suspenso Repeat once by para uma ocorrência mais frequente, como Minute ou Hour

Select An Event Type
Selecione Function.
Function
Selecione updateMonthlyPurchaseOrders.
8
9

Crie um índice do Atlas Search na collection monthlyPhoneTransactions.

1

Clique em Database no canto superior esquerdo do Atlas para navegar até a página Database Deployments do seu projeto.

2
3
4
5
6
  1. No campo Index Name, digite monthlyPhoneTransactions.

  2. Na seção Database and Collection, localize o banco de dados sample_supplies e selecione a coleção monthlyPhoneTransactions.

  3. Clique em Next.

7
8
9

Uma janela modal é exibida para que você saiba que seu índice está construindo. Clique no botão Close.

10

O índice recém-criado aparece na aba Atlas Search. Enquanto o índice está construindo, o campo StatusBuild in Progress. Quando o índice terminar de construir, o campo StatusActive.

Observação

Collections maiores demoram mais tempo para indexar. Você receberá uma notificação por e-mail quando seu índice terminar a criação.

Execute uma query na collection monthlyPhoneTransactions recém-atualizada e indexada.

1

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.

2

Execute o seguinte comando no prompt mongosh :

use sample_supplies
3

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.

← Como executar Atlas Search em coleções