Mongo 📑
- Autor
- Name
- Anibal Santos
- Publicado
- Lectura
- 4 '
Conectar MongoDB Shell
mongo # nos conectamos to mongodb://127.0.0.1:27017 por defectomongo --host <host> --port <port> -u <user> -p <pwd> # omitir la contraseña si se desea un avisomongo "mongodb://192.168.1.1:27017"mongo "mongodb+srv://cluster-name.abcde.mongodb.net/<dbname>" --username <username> # MongoDB Atlas
Helpers
Mostrar bases de datos
show dbsdb // imprime la actual base de datos
Cambiar de base de datos
use <database_name>
Mostrar colecciones
show collections
Ejectuar un archivo ``.js
load("myScript.js")
CRUD
Crear
db.coll.insertOne({name: "Max"})db.coll.insert([{name: "Max"}, {name:"Alex"}])db.coll.insert([{name: "Max"}, {name:"Alex"}], {ordered: false})db.coll.insert({date: ISODate()})db.coll.insert({name: "Max"}, {"writeConcern": {"w": "majority", "wtimeout": 5000}})
Leer
db.coll.findOne() // devuelve un único documentodb.coll.find() // devuelve un cursor - muestra 20 resultados - "it" para mostrar másdb.coll.find().pretty()db.coll.find({name: "Max", age: 32}) // operador 'AND' implícito.db.coll.find({date: ISODate("2020-09-25T13:57:17.180Z")})db.coll.find({name: "Max", age: 32}).explain("executionStats") // o "queryPlanner" o "allPlansExecution"db.coll.distinct("name")// Contardb.coll.count({age: 32}) // estimación basada en los metadatos de la coleccióndb.coll.estimatedDocumentCount() // estimación basada en los metadatos de la coleccióndb.coll.countDocuments({age: 32}) // alias para un proceso de agregación - recuento preciso// Comparardb.coll.find({"year": {$gt: 1970}})db.coll.find({"year": {$gte: 1970}})db.coll.find({"year": {$lt: 1970}})db.coll.find({"year": {$lte: 1970}})db.coll.find({"year": {$ne: 1970}})db.coll.find({"year": {$in: [1958, 1959]}})db.coll.find({"year": {$nin: [1958, 1959]}})// Operador lógicodb.coll.find({name:{$not: {$eq: "Max"}}})db.coll.find({$or: [{"year" : 1958}, {"year" : 1959}]})db.coll.find({$nor: [{price: 1.99}, {sale: true}]})db.coll.find({ $and: [ {$or: [{qty: {$lt :10}}, {qty :{$gt: 50}}]}, {$or: [{sale: true}, {price: {$lt: 5 }}]} ]})// Elementodb.coll.find({name: {$exists: true}})db.coll.find({"zipCode": {$type: 2 }})db.coll.find({"zipCode": {$type: "string"}})// Agregación Pipelinedb.coll.aggregate([ {$match: {status: "A"}}, {$group: {_id: "$cust_id", total: {$sum: "$amount"}}}, {$sort: {total: -1}}])// Búsqueda de texto con un índice "text"db.coll.find({$text: {$search: "cake"}}, {score: {$meta: "textScore"}}).sort({score: {$meta: "textScore"}})// Regexdb.coll.find({name: /^Max/}) // regex: starts by letter "M"db.coll.find({name: /^Max$/i}) // regex case insensitive// Arraydb.coll.find({tags: {$all: ["Realm", "Charts"]}})db.coll.find({field: {$size: 2}}) // imposible de indexar - mejor almacenar el tamaño del array y actualizarlodb.coll.find({results: {$elemMatch: {product: "xyz", score: {$gte: 8}}}})// Projectionsdb.coll.find({"x": 1}, {"actors": 1}) // actors + _iddb.coll.find({"x": 1}, {"actors": 1, "_id": 0}) // actorsdb.coll.find({"x": 1}, {"actors": 0, "summary": 0}) // all but "actors" and "summary"// Sort, skip, limitdb.coll.find({}).sort({"year": 1, "rating": -1}).skip(10).limit(3)// Read Concerndb.coll.find().readConcern("majority")
Actualizar
db.coll.update({"_id": 1}, {"year": 2016}) // ADVERTENCIA Sustituye a todo el documentodb.coll.update({"_id": 1}, {$set: {"year": 2016, name: "Max"}})db.coll.update({"_id": 1}, {$unset: {"year": 1}})db.coll.update({"_id": 1}, {$rename: {"year": "date"} })db.coll.update({"_id": 1}, {$inc: {"year": 5}})db.coll.update({"_id": 1}, {$mul: {price: NumberDecimal("1.25"), qty: 2}})db.coll.update({"_id": 1}, {$min: {"imdb": 5}})db.coll.update({"_id": 1}, {$max: {"imdb": 8}})db.coll.update({"_id": 1}, {$currentDate: {"lastModified": true}})db.coll.update({"_id": 1}, {$currentDate: {"lastModified": {$type: "timestamp"}}})// Arraydb.coll.update({"_id": 1}, {$push :{"array": 1}})db.coll.update({"_id": 1}, {$pull :{"array": 1}})db.coll.update({"_id": 1}, {$addToSet :{"array": 2}})db.coll.update({"_id": 1}, {$pop: {"array": 1}}) // last elementdb.coll.update({"_id": 1}, {$pop: {"array": -1}}) // first elementdb.coll.update({"_id": 1}, {$pullAll: {"array" :[3, 4, 5]}})db.coll.update({"_id": 1}, {$push: {scores: {$each: [90, 92, 85]}}})db.coll.updateOne({"_id": 1, "grades": 80}, {$set: {"grades.$": 82}})db.coll.updateMany({}, {$inc: {"grades.$[]": 10}})db.coll.update({}, {$set: {"grades.$[element]": 100}}, {multi: true, arrayFilters: [{"element": {$gte: 100}}]})// Actualizar muchosdb.coll.update({"year": 1999}, {$set: {"decade": "90's"}}, {"multi":true})db.coll.updateMany({"year": 1999}, {$set: {"decade": "90's"}})// Encontrar uno y actualizarlodb.coll.findOneAndUpdate({"name": "Max"}, {$inc: {"points": 5}}, {returnNewDocument: true})// Actualizardb.coll.update({"_id": 1}, {$set: {item: "apple"}, $setOnInsert: {defaultQty: 100}}, {upsert: true})// Reemplazardb.coll.replaceOne({"name": "Max"}, {"firstname": "Maxime", "surname": "Beugnet"})// Guardardb.coll.save({"item": "book", "qty": 40})// Write concerndb.coll.update({}, {$set: {"x": 1}}, {"writeConcern": {"w": "majority", "wtimeout": 5000}})
Eliminar
db.coll.remove({name: "Max"})db.coll.remove({name: "Max"}, {justOne: true})db.coll.remove({}) // ADVERTENCIA Elimina todos los documentos, pero no la propia colección y sus definiciones de índicedb.coll.remove({name: "Max"}, {"writeConcern": {"w": "majority", "wtimeout": 5000}})db.coll.findOneAndDelete({"name": "Max"})
Bases de datos y colecciones
Eliminar
db.coll.drop() // elimina la colección y sus definiciones de índicedb.dropDatabase() // comprueba que no estás en el clúster de PROD... 😄
Crear colección
// Crear colección con un $jsonschemadb.createCollection("contacts", { validator: {$jsonSchema: { bsonType: "object", required: ["phone"], properties: { phone: { bsonType: "string", description: "must be a string and is required" }, email: { bsonType: "string", pattern: "@mongodb\.com$", description: "must be a string and match the regular expression pattern" }, status: { enum: [ "Unknown", "Incomplete" ], description: "can only be one of the enum values" } } }}})
Otras funciones para colecciones
db.coll.stats()db.coll.storageSize()db.coll.totalIndexSize()db.coll.totalSize()db.coll.validate({full: true})db.coll.renameCollection("new_coll", true) // Segundo parámetro para eliminar la colección de destino si existe
Índices
Listar índices
db.coll.getIndexes()db.coll.getIndexKeys()
Crear índices
// Index Typesdb.coll.createIndex({"name": 1}) // índice de campo únicodb.coll.createIndex({"name": 1, "date": 1}) // índice compuestodb.coll.createIndex({foo: "text", bar: "text"}) // índice de textodb.coll.createIndex({"$**": "text"}) // índice de texto comodíndb.coll.createIndex({"userMetadata.$**": 1}) // índice comodíndb.coll.createIndex({"loc": "2d"}) // índice 2ddb.coll.createIndex({"loc": "2dsphere"}) // índice 2ddb.coll.createIndex({"_id": "hashed"}) // índice hash// Index Optionsdb.coll.createIndex({"lastModifiedDate": 1}, {expireAfterSeconds: 3600}) // TTL indexdb.coll.createIndex({"name": 1}, {unique: true})db.coll.createIndex({"name": 1}, {partialFilterExpression: {age: {$gt: 18}}}) // partial indexdb.coll.createIndex({"name": 1}, {collation: {locale: 'en', strength: 1}}) // case insensitive index with strength = 1 or 2db.coll.createIndex({"name": 1 }, {sparse: true})
Eliminar índices
db.coll.dropIndex("name_1")
Ocultar/mostrar índices
db.coll.hideIndex("name_1")db.coll.unhideIndex("name_1")
Comandos prácticos
use admindb.createUser({"user": "root", "pwd": passwordPrompt(), "roles": ["root"]})db.dropUser("root")db.auth( "user", passwordPrompt() )use testdb.getSiblingDB("dbname")db.currentOp()db.killOp(123) // opiddb.fsyncLock()db.fsyncUnlock()db.getCollectionNames()db.getCollectionInfos()db.printCollectionStats()db.stats()db.getReplicationInfo()db.printReplicationInfo()db.isMaster()db.hostInfo()db.printShardingStatus()db.shutdownServer()db.serverStatus()db.setSlaveOk()db.getSlaveOk()db.getProfilingLevel()db.getProfilingStatus()db.setProfilingLevel(1, 200) // 0 == OFF, 1 == ON with slowms, 2 == ONdb.enableFreeMonitoring()db.disableFreeMonitoring()db.getFreeMonitoringStatus()db.createView("viewName", "sourceColl", [{$project:{department: 1}}])