Introducció a MongoDB
Després de la instal·lació tenim:
$ whereis mongo mongo: /usr/bin/mongo /usr/share/man/man1/mongo.1.gz ls /usr/bin/mongo /usr/bin/mongo $ ls /usr/bin/mongo* /usr/bin/mongo /usr/bin/mongofiles /usr/bin/mongos /usr/bin/mongod /usr/bin/mongoimport /usr/bin/mongostat /usr/bin/mongodump /usr/bin/mongoperf /usr/bin/mongotop /usr/bin/mongoexport /usr/bin/mongorestore
Components principals:
- bin/mongod - The database process. -> el servidor, el motor
- bin/mongos - Sharding controller. -> eina de replicació
- bin/mongo - The database shell (uses interactive javascript).
La database està formada per col.leccions (podem pensar-ho com a taules). I les col.leccions estan formades per Documents (podem pensar-ho com a files). Aquests Documents al final seran objectes. Aquests objectes es representen en JSON (Javascript Object Notation).
Això és un objecte JSON (està entre claus): { "name":"Joan", "cognoms":"Quintana Compte", "email": ["joanqc@gmail.com", "jquintana@jaumebalmes.net"], "telefon": "636 51 77 85" }
És un conjunt de parelles nom:valor. El valor del camp nom és un array (va amb claudàtors), i té dos elements.
Quan acabem d'instal·lar tenim la base de dades test, i no té cap col·lecció:
$ mongo > db //per defecte estem connectats a la base de dades test test > show collections >
Creo una col.lecció students (si no existeix, es crea). Sobre la col.lecció students, existeix l'operació insert, per inserir documents. Hem de passar com a argument el document que volem inserir. I el document l'hem de passar en format JSON.
> db.students.insert({"name":"Joan", age:25})
WriteResult({ "nInserted" : 1 })
Ara ja tenim una col·lecció i una taula:
> show collections students > show tables students
Això és un recordatori de què les col.leccions serien com les taules.
Per recuperar la informació que hem inserit:
> db.students.find()
{ "_id" : ObjectId("6082d776a8d8f2ae16ba2bc8"), "name" : "Joan", "age" : 25 }
o millor, per veure bé l'estructura de l'objecte:
> db.students.find().pretty()
{
"_id" : ObjectId("6082d776a8d8f2ae16ba2bc8"),
"name" : "Joan",
"age" : 25
}
L'estructura és dinàmica, ara creo un document amb una altra estructura.
> db.students.insert({"name":"Pere", "cognoms":"de la Cullera", age:5})
> db.students.find().pretty()
{
"_id" : ObjectId("6082d776a8d8f2ae16ba2bc8"),
"name" : "Joan",
"age" : 25
}
{
"_id" : ObjectId("6082d98fa8d8f2ae16ba2bc9"),
"name" : "Pere",
"cognoms" : "de la Cullera",
"age" : 5
}
> db.students.count() 2
Fitxer de configuració:
$ nano /etc/mongod.conf
Veure que té una interfície de xarxa TCP, pel port 27017. Formes alternatives de connectar-se:
- mongo test
- mongo localhost/test
- mongo localhost:27017/test
Hi ha altres bases de dades:
> show dbs admin 0.000GB config 0.000GB local 0.000GB product 0.000GB test 0.000GB
Podem canviar a la base de dades product:
> use product
switched to db product
> show collections
products
> db.products.find()
{ "_id" : ObjectId("5ccb205c7740f0280ee2d277"), "prod_ref" : "ref12", "prod_name" : "GBA", "prod_desc" : "Game Boy Advance 1994", "prod_price" : 88, "updated_at" : ISODate("2019-05-02T16:52:44.146Z"), "__v" : 0 }
{ "_id" : ObjectId("5ccb2a4b7740f0280ee2d278"), "prod_ref" : "34", "prod_name" : "sdf", "prod_desc" : "sdf desc", "prod_price" : 34, "updated_at" : null, "__v" : 0 }
...
En la interfície de Mongo podem utilitzar Javascript:
> use test
> for (var i=0; i<=7000; i++) {
db.logs.insert({"_id": i, "ranking":Math.random()});
}
> db.logs.find()
{ "_id" : 0, "ranking" : 0.48693637494310693 }
{ "_id" : 1, "ranking" : 0.9805899420487253 }
{ "_id" : 2, "ranking" : 0.12136667863678441 }
{ "_id" : 3, "ranking" : 0.7458044616524797 }
...
Per esborrar aquests valors:
> db.logs.drop() true > db.logs.find() >
Anem a inserir uns quants estudiants més:
> use test
db.students.insert({"name":"Jordi", age:20})
db.students.insert({"name":"Martí", age:18})
db.students.insert({"name":"Maria", age:16})
db.students.insert({"name":"Rita", age:14})
db.students.insert({"name":"Clara", age:12})
db.students.insert({"name":"Pau", age:10})
db.students.insert({"name":"Jeroni", age:12})
db.students.insert({"name":"Rosa", age:14})
db.students.insert({"name":"Montserrat", age:16})
db.students.insert({"name":"Anna", age:18})
db.students.insert({"name":"Miquel", age:20})
> db.students.find()
i anem a fer les operacions bàsiques. Ja sabem fer inserts, anem a fer una lectura (select) una mica més interessant, un update i un delete.
db.students.find({ age: { $gt:14} }).sort({age:1})
{ "_id" : ObjectId("6082dfd0f42d8640eeeff842"), "name" : "Maria", "age" : 16 }
{ "_id" : ObjectId("6082dfd0f42d8640eeeff848"), "name" : "Montserrat", "age" : 16 }
{ "_id" : ObjectId("6082dfd0f42d8640eeeff841"), "name" : "Martí", "age" : 18 }
{ "_id" : ObjectId("6082dfd0f42d8640eeeff849"), "name" : "Anna", "age" : 18 }
{ "_id" : ObjectId("6082dfd0f42d8640eeeff840"), "name" : "Jordi", "age" : 20 }
{ "_id" : ObjectId("6082dfd0f42d8640eeeff84a"), "name" : "Miquel", "age" : 20 }
{ "_id" : ObjectId("6082d776a8d8f2ae16ba2bc8"), "name" : "Joan", "age" : 25 }
> db.students.find({ age: { $gt:14} }).sort({age:1}).count()
7
Les select poden arribar a ser molt complicades. Per exemple, també existeixen funcions d'agregació (equivalent al group by de SQL).
db.students.updateOne(
{ name: "Miquel" },
{
$set: { age: 22 }
}
)
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
> db.students.find({ age: { $eq:22} }).sort({age:1})
{ "_id" : ObjectId("6082dfd0f42d8640eeeff84a"), "name" : "Miquel", "age" : 22 }
db.students.updateMany(
{ age: 18 },
{
$set: { age: 22 }
}
)
{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 }
> db.students.find({ age: { $eq:22} }).sort({age:1})
{ "_id" : ObjectId("6082dfd0f42d8640eeeff841"), "name" : "Martí", "age" : 22 }
{ "_id" : ObjectId("6082dfd0f42d8640eeeff849"), "name" : "Anna", "age" : 22 }
{ "_id" : ObjectId("6082dfd0f42d8640eeeff84a"), "name" : "Miquel", "age" : 22 }
TODO
Exemple pràctic d'on es pot utilitzar Mongo pàg web oficial Programació python, nodejs, php
creat per Joan Quintana Compte, abril 2021