Intro to MongoDB

NodeJS #4

MongoDB

Système de gestion de bases de données orienté Document

  • Schema-less,
  • Performant (surtout en lecture),
  • Coeur écrit en C++,
  • Requêtes écrites en Javascript.
  • Données stockées au format BSON (binary JSON).
  • Automatic scaling.

NoSQL

Manipuler des BDD géantes pour des sites web de très grande audience

Not Only SQL

NoSQL vs SQL

Termes

MongoDB

{
  "_id": ObjectId("4efa8d2b7d284dad101e4bc7"),
  "Nom": "PELLERIN",
  "Prénom": "Franck",
  "Âge": 29,
  "Adresse": 
   {
    "Rue" : "1 chemin des Loges",
    "Ville": "VERSAILLES"
   }
}

Document

  • Embedded documents and arrays reduce need for expensive joins.
  • Dynamic schema supports fluent polymorphism.

MongoDB

Collection

MongoDB

brew update
brew install mongodb

Installation

Sur MacOS

Sur Ubuntu, ...

Sur Windows 😱

MongoDB

mkdir db
mongod --dbpath db

Démarrage

En développement

mongo

Lancer le mongo shell

MongoDB

db

Shell

BDD actuelle ?

show dbs

Toutes les BDD ?

MongoDB

use myDB

Usage

Utiliser une base de données

use myNewDB
db.myNewCollection1.insert( { x: 1 } )

Créer une collection et une base de données (à la première insertion)

MongoDB

Queries

MongoDB

Queries

Modifiers : limit, sort, skip

MongoDB provides a db.collection.findOne() method as a special case of find() that returns a single document.

Criterias: $gt, $lt, $gte, $lte, $in, $nin, $eq ...

MongoDB

db.users.find({ $or: [ { status: "A" } , { age: 50 } ] })

Queries

Exclure l'ID et inclure le "name"

db.users.find()
db.users.find({ status: "A" });
db.records.find({ "user_id": { $lt: 42} }, { "_id": 0, "name": 1 })

Select all

Tous les champs avec status = A

Tous les champs avec status = A ou age = 50

MongoDB

Embedded

db.inventory.find( { 'producer.company': 'ABC123' } )

Embedded Document

db.things.insert(
   {
     thingId: 2,
     producer: {
       name: 'toto',
       company: 'ABC123'
     }
   }
)

Avec des documents imbriqués

MongoDB

SQL to MongoDB

MongoDB

Insert one document

db.inventory.insert(
   {
     item: "ABC1",
     details: {
        model: "14Q3",
        manufacturer: "XYZ Company"
     },
     stock: [ { size: "S", qty: 25 }, { size: "M", qty: 50 } ],
     category: "clothing"
   }
)

MongoDB

Insert several docs

var mydocuments = [...];
db.inventory.insert( mydocuments );

MongoDB

Modification

db.users.update(
   { age: { $gt: 25 } },
   { $set: { status: "C" } },
   { multi: true }
)
db.users.update(
    { },
    { $set: { join_date: new Date() } },
    { multi: true }
)

Modifier plusieurs items selon des critères

Ajouter un nouveau champ avec la date à tous les items

db.users.update(
    { },
    { $unset: { join_date: "" } },
    { multi: true }
)

Supprimer un champ pour tous les items

MongoDB

Modification

db.inventory.update(
   { item: "TBD1" },
   {
     item: "TBD1",
     details: { "model" : "14Q4", "manufacturer" : "ABC Company" },
     stock: [ { "size" : "S", "qty" : 25 } ],
     category: "houseware"
   },
   { upsert: true }
)

Remplacer complètement un doc ($upsert)

MongoDB

Suppression

// Rm specific items
db.users.remove( { status: "D" } );

// Rm all
db.users.remove( {} );

exercice

mongoimport --db mydb --collection restaurants --drop --file dataset.json
https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/dataset.json

1) Récupérer le dump json à l'adresse suivante

2) Importer le dump dans une collection "restaurants"

{
  "address": {
     "building": "1007",
     "coord": [ -73.856077, 40.848447 ],
     "street": "Morris Park Ave",
     "zipcode": "10462"
  },
  "borough": "Bronx",
  "cuisine": "Bakery",
  "grades": [
     { "date": { "$date": 1393804800000 }, "grade": "A", "score": 2 },
     { "date": { "$date": 1378857600000 }, "grade": "A", "score": 6 }
  ],
  "name": "Morris Park Bake Shop",
  "restaurant_id": "30075445"
}

Exemple de document de la collection

exercice

3) Afficher le nombre total d'enregistrements.

4) Compter les restaurants dans le Bronx. 

5) Afficher les restaurants dans le Bronx ou dans le Queens.

6) Afficher les restaurants dont le code postal est 11219.

7) Même que 6 mais n'afficher que les noms (sans ids).

8) Même que 7 mais trier par ordre alphabétique.

9) Afficher les restaurants qui ont obtenu un score supérieur ou égal à 20.

A l'aide de Robomongo 2 (ou du shell)

exercice

10) Afficher le nom du restaurant ayant pour identifiant 30075445.

11) Afficher les noms des 3 derniers restaurants de la liste triée par ordre alphabétique (par nom).

14) Créer un index sur le champ "name"

A l'aide de Robomongo 2 (ou du shell)

MongoDB

Aggregation

MongoDB

Aggregation simple (distinct)

1) Lister les noms des quartiers (sans doublon !).

2) Afficher le nombre de quartiers différents.

3) Afficher le nombre de restaurants italiens dans chacun des quartiers.

4) Afficher les restaurants avec leur note moyenne ($unwind).

exercice

A l'aide de Robomongo 2 (ou du shell)

Made with Slides.com