Diferències

Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.

Enllaç a la visualització de la comparació

Ambdós costats versió prèvia Revisió prèvia
Següent revisió
Revisió prèvia
info:cursos:mongodbuniversity:m001:cap2 [09/12/2018 11:20] – [conexión] mateinfo:cursos:mongodbuniversity:m001:cap2 [14/12/2018 10:21] (actual) – [conexión] mate
Línia 18: Línia 18:
   * modificar path   * modificar path
  
-=== conexión+=== conexión RS curso
 <code bash> <code bash>
 mongo "mongodb://cluster0-shard-00-00-jxeqq.mongodb.net:27017,cluster0-shard-00-01-jxeqq.mongodb.net:27017,cluster0-shard-00-02-jxeqq.mongodb.net:27017/test?replicaSet=Cluster0-shard-0" --authenticationDatabase admin --ssl --username m001-student --password m001-mongodb-basics mongo "mongodb://cluster0-shard-00-00-jxeqq.mongodb.net:27017,cluster0-shard-00-01-jxeqq.mongodb.net:27017,cluster0-shard-00-02-jxeqq.mongodb.net:27017/test?replicaSet=Cluster0-shard-0" --authenticationDatabase admin --ssl --username m001-student --password m001-mongodb-basics
Línia 32: Línia 32:
   * creación cluster en AWS (free tier)   * creación cluster en AWS (free tier)
   * settings   * settings
-    * project name: *M001*+    * project name: **M001**
   * Security   * Security
     * IP Whitelist -> Allow access from anywhere     * IP Whitelist -> Allow access from anywhere
     * MongoDB Users -> new user     * MongoDB Users -> new user
 +      * user: **m001-student**
 +      * pass: **m001-mongodb-basics**
 +
 +== Connecting to your sandbox cluster from mongo shell
 +  * desde Atlas GUI, Overview -> Connect
 +    * usar mongodb-shell connection<code bash v3.4+>mongo "mongodb://sandbox-shard-00-00-cab0l.mongodb.net:27017,sandbox-shard-00-01-cab0l.mongodb.net:27017,sandbox-shard-00-02-cab0l.mongodb.net:27017/test?replicaSet=Sandbox-shard-0" --ssl --authenticationDatabase admin --username m001-student --password m001-mongodb-basics</code>
 +
 +== Loading data into your sandbox cluster
 +  * ''show dbs''
 +  * descargar datos de ejemplo y cargar en mi cluster
 +  * ''load("loadMovieDetailsDataset.js")''
 +{{ :info:cursos:mongodbuniversity:m001:loadmoviedetailsdataset.zip |}}
 +
 +== Connecting to your sandbox cluster from Compass
 +  * Desde Atlas, y en modo simplificado, identificar al servidor primario de nuestro cluster
 +  * crear una nueva conexión, guardar como favorito
 +
 +== Creating Documents
 +  * create documents = inserts
 +
 +=== insertOne()
 +desde Compass:
 +  * crear nueva colección
 +  * insertar nuevo documento
 +{{ :info:cursos:mongodbuniversity:m001:pasted:20181209-114537.png }}
 +
 +desde mongodb-shell:
 +  * ''db'' -> database en uso
 +  * <code bash>db.moviesScratch.insertOne({title:"Star Trek II: Thw Wrath of man", year: 1982, imdb: "TT0084726"})</code>
 +    * creará la colección si esta no existiese
 +{{ :info:cursos:mongodbuniversity:m001:pasted:20181209-115139.png }}
 +
 +  * todo documento de una colección ha de tener un identificador único: **_id**
 +  * si nosotros no se lo creamos, se creará por nosotros
 +  * <code bash>db.moviesScratch.insertOne({_id: "tt0084726", title:"Star Trek II: Thw Wrath of man", year: 1982, imdb: "TT0084726"})</code>
 +  * no conviene mezclar en una colección diferentes tipos de **_id**:
 +{{ :info:cursos:mongodbuniversity:m001:pasted:20181209-115751.png }}
 +
 +=== insertMany()
 +  * en lugar de pasar un objeto **{...}** le pasaremos un array **[ {...},{...},...,{...}]**
 +<code javascript>
 +db.moviesScratch.insertMany(
 +    [
 +        {
 +      "_id" : "tt0084726",
 +      "title" : "Star Trek II: The Wrath of Khan",
 +      "year" : 1982,
 +      "type" : "movie"
 +          },
 +          {
 +      "_id" : "tt0796366",
 +      "title" : "Star Trek",
 +      "year" : 2009,
 +      "type" : "movie"
 +          },
 +          {
 +      "_id" : "tt0084726",
 +      "title" : "Star Trek II: The Wrath of Khan",
 +      "year" : 1982,
 +      "type" : "movie"
 +          },
 +          {
 +      "_id" : "tt1408101",
 +      "title" : "Star Trek Into Darkness",
 +      "year" : 2013,
 +      "type" : "movie"
 +          },
 +          {
 +      "_id" : "tt0117731",
 +      "title" : "Star Trek: First Contact",
 +      "year" : 1996,
 +      "type" : "movie"
 +        }
 +    ]
 +);
 +</code>
 +  * por defecto, **insertMany()** trabaja de manera "ordenada", podemos especificarle que no es así añadiendo un segundo parámetro al comando: **{[...],{"ordered": false}}**
 +  * si intentamos introducir 2 documentos con el mismo **_id** dará un error y dejará de insertar documentos. 
 +  * si le hemos indicado el **ordered: false**, no insertará aquellos que den errores, pero continuará insertando el resto
 +{{ :info:cursos:mongodbuniversity:m001:insertmany.zip |}}
 +
 +== Lab 2.2
 +
 +== Reading documents: scalar fields
 + * AND: ''{"campo1": restricción1, "campo2": restricción2}''
 + * OBJECTS: ''{"objeto.campo": valor1, "objeto.subobjeto.campo": valor2}''
 +
 +=== ejemplo/quiz
 +buscar en **movieDetails** cuantas películas han ganado 2 galardones y han tenido 2 nominaciones:
 +
 +  * mongodb shell: ''db.movieDetails.find({"awards.wins": 2, "awards.nominations": 2}).count()''
 +  * compass: ''{awards.wins: 2, awards.nominations: 2}''
 +
 +== 2.7 Array Fields
 +  * ''db.movies.find({cast: ["Jeff Bridges", "Tim Robbins"]}).pretty()'' : muestra solo los documentos que cumplen exactamente el critero de tener 2 elementos en el array *cast* con esos actores
 +  * ''db.movies.find({cast: "Jeff Bridges"}).pretty()'' : muestra los documentos donde aparece ese actor, aunque no exclusimante y sin tener importancia el orden
 +  * ''db.movies.find({"cast.0": "Jeff Bridges"}).pretty()'' : busca el actor en la primera posición del array *cast*
 +
 +== Cursors
 +  * apunta al documento en curso
 +  * en mongoshell, itera 20 resultados... si queremos más, podemos ejecutar ''it''
 +
 +== Projections
 +  * límita el número de campos que devuelve
 +  * se usa (¿exclusivo?) como segundo parámetro en ''find()''
 +    * ''db.movies.find({genre: "Action,Adventure"},{title: 1})'' : muestra solo el título
 +    * el **_id** se devuelve por defecto en todas las proyecciones, aunque se puede excluir - como otros campos- si se especifica (con un **0**):
 +    * ''db.movies.find({genre: "Action,Adventure"},{title: 1, _id:0})'' : idem anterior, pero sin el campo **_id**
 +    * se pueden especificar campos (con el **0**) que no se quieren mostrar
 +
 +== UpdateOne()
 +  * primero se aplica un filtro al que aplicar el update
 +  * el primero que cumpla el criterio, será el actualizado
 +  * el segundo argumento especifica que queremos actualizar, a través de **$set**
 +<code javascript>db.movieDetails.updateOne({
 +    title: "The Martian"
 +  }, {
 +    $set: {
 +      poster: "http://..."
 +    }
 +  })</code>
 +  
 +la respuesta será:''{"acknowledged": true, "matchedCount": 1, "modifiedCount": 1 }'', donde:
 +  * **acknowledged** indica que se ha ejecutado correctamente
 +  * **matchedCount** indica cuantos registros cumplen el criterio
 +  * **modifiedCount** si se ha modificado o no (en este caso 1 o 0, no puede haber más)
 +
 +<code javascript>db.movieDetails.updateOne({
 +    title: "The Martian"
 +  }, {
 +    $set: {
 +      "awards": {
 +        "wins": 8,
 +        "nominations": 14
 +      }
 +    }
 +  })</code>
 +  
 +  
 +== Update Operators
 +For update operations, update operators specify how to modify specific fields in documents matching a filter. Fields may be added, deleted, or have their value changed in some way. Update operators define what modifications to make with respect to one or more fields in matching documents.
 +
 +  * $set : añade campos
 +  * $unset : elimina campos
 +  * $min
 +  * $max
 +  * $inc : incrementa el valor del campo/campos en el valor indicado
 +  * $addToSet : añade elementos a un array (si no existen previamente)
 +  * $pop : elimina el primer / último elemento de un array
 +  * $pullAll : elimina los valores que coíncidan
 +  * $pull : elimina el campo que coincida
 +  * $push: añade un array de elementos<code javascript>
 +let review = [
 +  "aadasdsada",
 +  "dsdadasdsadasdsa",
 +  "asdasfeadfsdafasfdsfasdfsda"
 +].join()
 +db.movieDetails.updateOne({
 +  title: "the martian"
 +},{
 +  $push: {
 +    reviews: {
 +      rating: 4.5,
 +      reviewer: "Spencer H.",
 +      text: review
 +    }
 +  }
 +})
 +</code>
 +el documento ahora tendrá un campo llamado **reviews** del tipo array con un objeto que contendrá los campos indicados (rating,reviewer, text)
 +
 +<code javascript>
 +let review = [
 +  "aadasdsada",
 +  "dsdadasdsadasdsa",
 +  "asdasfeadfsdafasfdsfasdfsda"
 +].join()
 +db.movieDetails.updateOne({
 +  title: "the martian"
 +},{
 +  $push: {
 +    reviews:{  
 +      $each: [{
 +        rating: 4.5,
 +        reviewer: "Spencer H.",
 +        text: review
 +      },{
 +        rating: 4.5,
 +        reviewer: "Spencer H.",
 +        text: review
 +      },{
 +        rating: 4.5,
 +        reviewer: "Spencer H.",
 +        text: review
 +      }]
 +    }
 +  }
 +})
 +</code>
 +
 +añade tantos objetos en el array como hay
 +
 +  * ... otros en la página de MongoDB : [[https://docs.mongodb.com/manual/reference/operator/update/]]
 +
 +== UpdateMany()
 +  * modifica todos los documentos que cumplen el registro
 +<code javascript>
 +db.movieDetails.updateMany({
 +  rated: null
 +},{
 +  $unset: {
 +    rated: ""
 +  }
 +})
 +</code>
 +elimina el campo rated = null de todos los documentos
 +
 +== Upserts
 +  * crear nuevos documentos
 +<code javascript>
 +let detail={[...]}
 +
 +db.movieDetails.updateOne({
 +  "imdb.id": detail.imdb.id
 +},{
 +  $set: detail
 +},{
 +  upsert: true
 +})
 +</code>
 +  * **detail** contiene todos los campos del documento
 +  * **$set** intenta actualizar el documento
 +  * **upsert=true** inserta si no existe el documento previamente (que cumpla el criterio del primer parámetro)
 +
 +== 2.14 replaceOne()
 +  * para aplicaciones en las que es más fácil reemplazar todo el documento
 +  * ''detailDoc = db.movieDetails.findOne({"imdb.id": "tt...."});''
 +  * ''detailDoc.poster;'' : printea null, no está definido
 +  * ''detailDoc.poster = "http://....";'' ; añade el campo
 +  * ''detailDoc.genres.push("Documentary");'' este **push** es un método javascript, no el operador visto anteriormente, y añade el valor al array de **genres**
 +  * con todos estos cambios sobre el documento, hacemos un replaceOne() para actualizarlo todo
 +<code javascript>
 +db.movieDetails.replaceOne({"imdb.id": detailDoc.imdb.id}, detailDoc);
 +</code>
 +
 +== Delete
 +  * deleteOne()
 +  * deleteMany()
 +
 +{{ :info:cursos:mongodbuniversity:m001:pasted:20181210-142929.png }}
 +{{ :info:cursos:mongodbuniversity:m001:loadreviewsdataset.zip |}}
  • info/cursos/mongodbuniversity/m001/cap2.1544383224.txt.gz
  • Darrera modificació: 09/12/2018 11:20
  • per mate