$elemMatch quando temos que avaliar por mais de um criterio ao mesmo tgemmpo {"grades": {$elemMatch: { "score": {$gte: 80, $lte: 100}}}} unwind separa o array como documentos proprios By using $unwind, you create one document per grades entry, making it possible to perform the aggregation ($avg) across individual score values. Without $unwind, MongoDB would try to calculate the average on the array itself, which isn't possible in the same way. db.test.insertOne({"product": 'monster' , "createdAt": new Date()}) db.test.createIndex({"createdAt": 1}, {expireAfterSeconds: 300 }); se quiser q o id nao apareca: \_id:0 2\. Apresente os **campos** restaurant\_id, nome, localidade e gastronomia para todos os documentos da coleção. > **db.restaurants.find({}, { restaurant\_id: 1, nome: 1, localidade: 1, gastronomia: 1})** // 5\. Apresente os **primeiros 15** restaurantes **localizados** no Bronx, **ordenados** por ordem crescente de nome. > **db.restaurants.find({ "localidade": "Bronx" }).sort({ "nome": 1 }).limit(15)** // 6\. Liste todos os restaurantes que tenham pelo menos**um score superior a 85**. > **db.restaurants.find({"grades": {$elemMatch: { "score": {$gt: 85}}}})** // 9\. Indique os restaurantes que **não têm gastronomia "American"**, tiveram uma (ou mais) pontuação superior a 70 **e** estão numa latitude inferior a -65\. > \*\*db.restaurants.find({"gastronomia": { $ne: "American"}, \*\*\*\*$and: \[ { "grades.score": { $gt: 70 } }, {"address.coord.0": { $lt: -65 } }\]})\*\* //11\. Liste o **nome**, a **localidade** e a **gastronomia** dos restaurantes que pertencem ao **Bronx** e cuja gastronomia é do tipo "**American**" ou "**Chinese**". \*\*db.restaurants.find({"localidade": "Bronx", $or: \[{ "gastronomia": "American" },{ "gastronomia": \*\*\*\*"Chinese" }\]}, {"nome": 1, "localidade": 1, "gastronomia": 1, "\_id": 0})\*\* \*\* \*\* //15\. Liste o restaurant\_id, o nome e os score dos restaurantes nos quais a segunda avaliação foi grade "A" e ocorreu em ISODATE "2014-08-11T00: 00: 00Z". db.restaurants.find({'grades.1.grade': {$eq: 'A'}, 'grades.1.date': {$eq: ISODate("2014-08-11T00:00:00Z")}}, {restaurant\_id: 1, nome: 1, 'grades.score': 1, "\_id": 0}) //17\. Liste nome, gastronomia e localidade de todos os restaurantes ordenando por ordem crescente da gastronomia e, em segundo, por ordem decrescente de localidade. db.restaurants.find({}, {nome: 1,gastronomia: 1, localidade: 1, "\_id": 0}).sort({gastronomia: 1, localidade: -1}) //18\. Liste nome, localidade, grade e gastronomia de todos os restaurantes localizados em Brooklyn que não incluem gastronomia "American" e obtiveram uma classificação (grade) "A". Deve apresentá-los por ordem decrescente de gastronomia. db.restaurants.find({ $and: \[ { localidade: 'Brooklyn' }, { gastronomia: { $ne: 'American' } }, { grades: { $elemMatch: { grade: 'A' } } } \] }, { nome: 1, localidade: 1, 'grades.grade': 1, gastronomia: 1, \_id: 0 }).sort({ gastronomia: -1 }); // 19\. Indique o número total de avaliações (numGrades) na coleção. db.restaurants.aggregate(\[ { $project: { numGrades: { $size: "$grades" } // Conta o número de avaliações em cada documento } }, { $group: { \_id: null, totalGrades: { $sum: "$numGrades" } // Soma o total de avaliações } } \]) 20\. Apresente o nome e número de avaliações (numGrades) dos 3 restaurante com mais avaliações. db.restaurants.aggregate(\[ { $project: { nome: 1, numGrades: { $size: "$grades" } } }, { $sort: { numGrades: -1 } }, { $limit: 3 } \]) **`$project`**: Cria um campo temporário `numGrades`, que contém o número de elementos na matriz `grades` e projeta também o nome do restaurante. **`$sort`**: Ordena os resultados pelo campo `numGrades` em ordem decrescente (`-1`). **`$limit`**: Limita os resultados aos 3 primeiros documentos com o maior número de avaliações. //21\. Apresente o número total de avaliações (numGrades) em cada dia da semana. db.restaurants.aggregate(\[ { $unwind: "$grades" }, { $project: { dayOfWeek: { $dayOfWeek: { $toDate: "$grades.date" } }, grade: 1 } }, { $group: { \_id: "$dayOfWeek", numGrades: { $sum: 1 } } }, { $sort: { \_id: 1 } //(1 = Domingo, 7 = Sábado) } \]) **`$unwind`**: Desagrega a matriz `grades` para que cada avaliação (grade) se torne um documento individual. **`$project`**: Utiliza o operador `$dayOfWeek` para extrair o dia da semana a partir da data da avaliação. Aqui, `$toDate` é usado para converter a data, caso seja necessária uma conversão. * O valor retornado pelo `$dayOfWeek` varia de 1 (Domingo) a 7 (Sábado). **`$group`**: Agrupa as avaliações pelo dia da semana (`_id: "$dayOfWeek"`) e conta o número total de avaliações (`$sum: 1`). **`$sort`**: Ordena os resultados pelo campo `_id`, que representa o dia da semana.