| Ambdós costats versió prèvia Revisió prèvia Següent revisió | Revisió prèvia |
| info:cursos:mongodbuniversity:m001:cap3 [15/12/2018 08:10] – [operators] mate | info:cursos:mongodbuniversity:m001:cap3 [15/12/2018 10:16] (actual) – [Challenge Problem] mate |
|---|
| * {{ :info:cursos:mongodbuniversity:m001:m001_all_operator.zip |}} | * {{ :info:cursos:mongodbuniversity:m001:m001_all_operator.zip |}} |
| |
| | |
| | * {{ :info:cursos:mongodbuniversity:m001:m001_size_operator.zip |}} |
| | * {{ :info:cursos:mongodbuniversity:m001:m001_elemmatch_operator.zip |}} |
| |
| === operators | === operators |
| * ''$all'' : todos los valores indicados en el array han de estar en el campo para dar **true** y ser visualizados | * ''$all'' : todos los valores indicados en el array han de estar en el campo para dar **true** y ser visualizados |
| * ''$size'' : | * ''$size'' : elementos de un campo del tipo array |
| * ''$elemMatch'' : | * ''$elemMatch'' : en el caso de campos del tipo **array** que contienen objetos, si realizamos una búsqueda por 2 criterios diferentes de alguna de las **key** de esos objetos y queremos que sean sobre el mismo objeto, debemos usar este opearador. De lo contrario, ''find'' obviará que se tenga que buscar en el mismo objeto y cogerá cualquiera de las keys de objetos diferentes |
| === ejemplos | === ejemplos |
| <code javascript></code> | películas que en el campo (Array) **genres** contengan "Comedy","Crime","Drama" (y otros, pero esos 3 obligatoriamente) |
| | <code javascript>db.movieDetails.find({genres: {$all: ["Comedy", "Crime", "Drama"]}}, |
| | {_id: 0, title: 1, genres: 1}).pretty() |
| | </code> |
| | |
| | Películas que tienen en el campo **countries** de tipo Array un solo elemento: |
| | <code javascript>db.movieDetails.find({countries: {$size: 1}}).pretty()</code> |
| | |
| | trabajar con un documento en memoria: |
| | <code javascript> |
| | mipelicula = db.movieDetails.findOne({title: "The Martian"}) // recupero el documento en una variable |
| | mipelicula // muestra el contenido de la variable |
| | delete mipelicula._id // elimino el campo _id (para evitar duplicados al re-insertarlo) |
| | mipelicula.nuevoCampo = "mivalor" // creo un nuevo campo |
| | db.movieDetails.insertOne(miPelicula); // inserto el documento (al no tener _id será uno nuevo respecto al anterior, con los cambios realizados |
| | </code> |
| | |
| | suponiendo que existe un campo llamado **boxOffice** que contiene un array de objetos tales: |
| | <code javascript> |
| | boxOffice: [ { "country": "USA", "revenue": 228.4 }, |
| | { "country": "Australia", "revenue": 19.6 }, |
| | { "country": "UK", "revenue": 33.9 }, |
| | { "country": "Germany", "revenue": 16.2 }, |
| | { "country": "France", "revenue": 19.8 } ] |
| | </code> |
| | |
| | si hacemos una búsqueda de este tipo sin usar ''$elemMatch'' obtendremos un resultado erróneo. En este caso, buscamos que **country** sea "Germany" y que **revenue** sea mayo que 17 - cosa que no se cumple para el mismo objeto - pero si que se cumple para 2 keys de objetos diferentes (**country** igual a Germany existe y **revenue** mayor que 17 también - para todos aquellos que no sean "Germany", de hecho), así que nos devolverá el documento como si estuviese cumpliendo la condición cuando no es así: |
| | <code javascript>db.movieDetails.find({"boxOffice.country": "Germany", "boxOffice.revenue": {$gt: 17}})</code> |
| | |
| | Si queremos buscar correctamente, se ha de usar ''$elemMatch''. En este caso, este documento no será devuelto pq no satisface la condición impuesta: |
| | <code javascript>db.movieDetails.find({boxOffice: {$elemMatch: {"country": "Germany", "revenue": {$gt: 17}}}})</code> |
| |
| == regex operator | == regex operator |
| === extras | === extras |
| | * {{ :info:cursos:mongodbuniversity:m001:m001_regex_operator.zip |}} |
| | |
| === operators | === operators |
| | * ''$mod'' : operación módulo (resto de división) |
| | * ''$regex'' : selecciona documentos que coinciden con la expresión regular dada. |
| | * ''$text'' : búsqueda de texto |
| | * ''$where'' : documentos que cumplen con una expresión JavaScript |
| | |
| === ejemplos | === ejemplos |
| <code javascript></code> | en ese caso la REGEX usada funciona: |
| | * ''/'' indica principio y final de la expresión regular |
| | * ''^'' indica principio de cadena |
| | * ''Won'' indica los caracteres que estamos buscando |
| | * ''.*'' indica otros caracteres, sean cuales sean |
| | <code javascript>db.movieDetails.find({"awards.text": {$regex: /^Won.* /}}, {_id: 0, title: 1, "awards.text": 1}).pretty() |
| | </code> |
| | |
| | == Challenge Problem |
| | Connect to our class Atlas cluster from the mongo shell or Compass and view the results.scores collection. How many documents contain at least one score in the results array that is greater than or equal to 70 and less than 80? |
| | <code javascript>{$and: [{"results": {$gte: 70}}, {"results": {$lt: 80}}] } // WRONG! --> RIGHT! (no leer bien el enunciado)</code> |
| | |
| | <code javascript>{"results": {$in: [{$gte: 70}, {$lt: 90}] } } // WRONG!</code> |
| | |
| | == Final Exam |
| | <button collapse="exam" size="xs">Algunas respuestas...</button> |
| | |
| | <collapse id="exam" collapsed="true"> |
| | |
| | * 4: Please connect to the M001 class Atlas cluster. You may answer this question using either the mongo shell or Compass. |
| | |
| | For this question we will use the citibike database. |
| | |
| | How many documents in the citibike.trips collection have the key tripduration set to null? Ignore any documents that do not contain the tripduration key.<code javascript>{$and: [{tripduration: {$exists: true}}, {tripduration: { $eq: null}} ] }</code> |
| | * 6: Please connect to the M001 class Atlas cluster from the mongo shell or Compass and view the video.movies collection. How many movies match the following criteria? |
| | |
| | The cast includes either of the following actors: "Jack Nicholson", "John Huston". |
| | The viewerRating is greater than 7. |
| | The mpaaRating is "R".<code javascript>{ cast: {$in:["Jack Nicholson","John Huston"]}, viewerRating:{$gt:7},mpaaRating:"R" }</code> |
| | |
| | </collapse> |