Overview
Los ejemplos de esta página demuestran cómo utilizar la API de consulta de MongoDB en una función para agregar documentos en su clúster Atlas.
MongoDB Las canalizaciones de agregación ejecutan todos los documentos de una colección a través de una serie de etapas de agregación de datos que le permiten filtrar y dar forma a los documentos, así como recopilar datos de resumen sobre grupos de documentos relacionados.
Nota
Etapas admitidas de agregación
Atlas App Services admite casi todas las etapas del pipeline de agregación y operadores de MongoDB, pero algunas etapas y operadores deben ejecutarse dentro de una función del sistema. Consulta Limitaciones del marco de trabajo de agregación para obtener más información.
Modelo de datos
Los ejemplos de esta página utilizan una colección denominada store.purchases
Contiene información sobre el historial de ventas de artículos en una tienda en línea. Cada documento contiene una lista de los artículos comprados items, incluyendo el artículo name y el quantity, así como un ID único del cliente que los compró.
{ "title": "Purchase", "required": ["_id", "customerId", "items"], "properties": { "_id": { "bsonType": "objectId" }, "customerId": { "bsonType": "objectId" }, "items": { "bsonType": "array", "items": { "bsonType": "object", "required": ["name", "quantity"], "properties": { "name": { "bsonType": "string" }, "quantity": { "bsonType": "int" } } } } } }
Configuración de fragmentos
Para utilizar un fragmento de código en una función, primero debe crear una instancia de un controlador de colección de MongoDB:
exports = function() { const mongodb = context.services.get("mongodb-atlas"); const itemsCollection = mongodb.db("store").collection("items"); const purchasesCollection = mongodb.db("store").collection("purchases"); // ... paste snippet here ... }
Ejecuta una pipeline de agregación
Puede ejecutar una canalización de agregación utilizando el collection.aggregate() método.
El siguiente fragmento de función agrupa todos los documentos de la purchases colección por su customerId valor y agrega un recuento del número de artículos que compra cada cliente, así como del número total de compras realizadas. Tras agrupar los documentos, la canalización añade un nuevo campo que calcula el promedio de artículos que cada cliente compra a la vez,, averageNumItemsPurchased al documento de cada cliente:
const pipeline = [ { "$group": { "_id": "$customerId", "numPurchases": { "$sum": 1 }, "numItemsPurchased": { "$sum": { "$size": "$items" } } } }, { "$addFields": { "averageNumItemsPurchased": { "$divide": ["$numItemsPurchased", "$numPurchases"] } } } ] return purchasesCollection.aggregate(pipeline).toArray() .then(customers => { console.log(`Successfully grouped purchases for ${customers.length} customers.`) for(const customer of customers) { console.log(`customer: ${customer._id}`) console.log(`num purchases: ${customer.numPurchases}`) console.log(`total items purchased: ${customer.numItemsPurchased}`) console.log(`average items per purchase: ${customer.averageNumItemsPurchased}`) } return customers }) .catch(err => console.error(`Failed to group purchases by customer: ${err}`))
Encuentre datos con Atlas Search
Puedes ejecutar consultas Atlas Search en una colección con collection.aggregate() y la etapa de agregación $search.
Importante
Servicios de aplicaciones realiza $search operaciones como usuario del sistema y aplica reglas a nivel de campo en los resultados de búsqueda. Esto significa que un usuario puede buscar en un campo sin acceso de lectura. En este caso, la búsqueda se basa en el campo especificado, pero ningún documento devuelto lo incluye.
exports = async function searchMoviesAboutBaseball() { // 1. Get a reference to the collection you want to search. const movies = context.services .get("mongodb-atlas") .db("sample_mflix") .collection("movies"); // 2. Run an aggregation with $search as the first stage. const baseballMovies = await movies .aggregate([ { $search: { text: { query: "baseball", path: "plot", }, }, }, { $limit: 5, }, { $project: { _id: 0, title: 1, plot: 1, }, }, ]) .toArray(); return baseballMovies; };
{ "plot" : "A trio of guys try and make up for missed opportunities in childhood by forming a three-player baseball team to compete against standard children baseball squads.", "title" : "The Benchwarmers" } { "plot" : "A young boy is bequeathed the ownership of a professional baseball team.", "title" : "Little Big League" } { "plot" : "A trained chimpanzee plays third base for a minor-league baseball team.", "title" : "Ed" } { "plot" : "The story of the life and career of the famed baseball player, Lou Gehrig.", "title" : "The Pride of the Yankees" } { "plot" : "Babe Ruth becomes a baseball legend but is unheroic to those who know him.", "title" : "The Babe" }
Nota
$$SEARCH_META Disponibilidad de variables
La variable de agregación $$SEARCH_META solo está disponible para funciones que se ejecutan como sistema o si el primer rol en la colección buscada tiene sus apply_when read expresiones y establecidas true en.
Si ninguno de estos dos escenarios se aplica, $$SEARCH_META no está definido y la agregación fallará.
Etapas de agregación
Filtrar Documentos
Puede utilizar la etapa $match para filtrar los documentos entrantes utilizando la sintaxis de consulta estándar de MongoDB.
{ "$match": { "<Field Name>": <Query Expression>, ... } }
Ejemplo
La siguiente etapa $match filtra los documentos entrantes para incluir solo aquellos donde el campo graduation_year tiene un valor entre 2019 y 2024, inclusive.
{ "$match": { "graduation_year": { "$gte": 2019, "$lte": 2024 }, } }
Documentos de grupo
Puede usar la etapa $group para agregar datos de resumen de grupos de uno o más documentos. MongoDB agrupa los documentos según la _id expresión.
Nota
Puede hacer referencia a un campo de documento específico anteponiendo un $ al nombre del campo.
{ "$group": { "_id": <Group By Expression>, "<Field Name>": <Aggregation Expression>, ... } }
Ejemplo
La siguiente etapa $group agrupa los documentos según el valor de su campo customerId y calcula la cantidad de documentos de compra en los que aparece cada customerId.
{ "$group": { "_id": "$customerId", "numPurchases": { "$sum": 1 } } }
Campos del documento del proyecto
Puede usar la etapa $project para incluir u omitir campos específicos de los documentos o para calcular nuevos campos mediante operadores de agregación. Para incluir un campo, establezca su valor 1 en. Para omitir un campo, establezca su valor 0 en.
Nota
No se pueden omitir e incluir simultáneamente campos distintos de _id. Si se incluye explícitamente un campo distinto de _id, cualquier campo no incluido explícitamente se omitirá automáticamente (y viceversa).
{ "$project": { "<Field Name>": <0 | 1 | Expression>, ... } }
Ejemplo
La siguiente etapa de $project omite el campo _id, incluye el campo customerId, y crea un campo nuevo llamado numItems donde el valor es el número de documentos en el arreglo items:
{ "$project": { "_id": 0, "customerId": 1, "numItems": { "$sum": { "$size": "$items" } } } }
Agregar campos a los documentos
Puede utilizar la etapa $addFields para agregar nuevos campos con valores calculados utilizando operadores de agregación.
Nota
$addFields es similar a $project pero no permite incluir u omitir campos.
Ejemplo
Las siguientes $addFields etapas crean un nuevo campo llamado numItems donde el valor es la cantidad de documentos en la matriz items:
{ "$addFields": { "numItems": { "$sum": { "$size": "$items" } } } }
Unwind Array Values
Puedes utilizar la etapa $unwind para agregar elementos individuales de campos de tipo arreglo. Cuando desenrollas un campo de un arreglo, MongoDB copia cada documento una vez por cada elemento del arreglo, pero reemplaza el valor del arreglo por el elemento del arreglo en cada copia.
{ $unwind: { path: <Array Field Path>, includeArrayIndex: <string>, preserveNullAndEmptyArrays: <boolean> } }
Ejemplo
La siguiente etapa $unwind crea un nuevo documento para cada elemento de la matriz items en cada documento. También añade un campo llamado itemIndex a cada nuevo documento que especifica el índice de posición del elemento en la matriz original:
{ "$unwind": { "path": "$items", "includeArrayIndex": "itemIndex" } }
Considere el siguiente documento de la colección purchases:
{ _id: 123, customerId: 24601, items: [ { name: "Baseball", quantity: 5 }, { name: "Baseball Mitt", quantity: 1 }, { name: "Baseball Bat", quantity: 1 }, ] }
Si aplicamos la etapa de ejemplo $unwind a este documento, la etapa genera los siguientes tres documentos:
{ _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 } }