Introducció a MongoDB
Contingut
Introducció
(TBD)
Instal·lació
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).
Ús bàsic de MongoDB
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 }
Per esborrar:
> db.students.remove( { age: { $lt: 14 } } );
WriteResult({ "nRemoved" : 4 })
Connexió amb diferents llenguatges de programació
PHP
$ sudo apt-cache search php | grep mongo php-mongodb - MongoDB driver for PHP $ sudo apt-get install php-mongodb
Treiem l'exemple bàsic de:
script php_mongo_example.php:
<?php
//connexió
$mng = new MongoDB\Driver\Manager("mongodb://localhost:27017");
echo "llistem les bases de dades:\n";
$listdatabases = new MongoDB\Driver\Command(["listDatabases" => 1]);
$res = $mng->executeCommand("admin", $listdatabases);
$databases = current($res->toArray());
foreach ($databases->databases as $el) {
echo $el->name . "\n";
}
// estudiants
echo "\nllistem els estudiants: \n";
$query = new MongoDB\Driver\Query([]);
$rows = $mng->executeQuery("test.students", $query);
foreach ($rows as $row) {
echo "$row->name : $row->age\n";
}
?>
Python
NodeJS
BASH
(bash no és un llenguatge de programació)
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