MongoDB R510

Sommaire classique, explications “comment / ou / pourquoi” et exemples TD/TP, puis Correcteur integre.

Sommaire

Partie 1 — Commandes (.methods)

.find(query, projection?)

comment db.collection.find(query, projection?) — filtrer; paginer avec .sort().limit().skip().

pourquoi lire sans calcul.

// Manhattan avec une note < 10, ne retourner que name + grades.score
db.restaurants.find(
  { "borough": "Manhattan", "grades.score": { "$lt": 10 } },
  { "name": 1, "grades.score": 1, "_id": 0 }
)

Projection (2e param)

{ "name": 1, "address.zipcode": 1, "_id": 0 }

Operateurs

// Comparaison, logique, tableaux
{ "grades.score": { "$gt": 50 } }
{ "$or": [ { "address.street": "Union Street" }, { "address.street": "Union Square" } ] }
{ "grades": { "$elemMatch": { "grade": "A", "score": { "$lt": 10 } } } }

.distinct(field, query?)

db.restaurants.distinct("cuisine")

.countDocuments(query)

db.restaurants.countDocuments({ "cuisine": "French" })

.sort(sortSpec)

db.restaurants.find({}).sort({ "name": 1 })

.limit(n)

db.restaurants.find({}).limit(10)

.skip(n)

db.restaurants.find({}).skip(20).limit(10)

.insertOne(doc)

db.coll.insertOne({ "a": 1 })

.updateOne(filter, update)

db.restaurants.updateOne(
  { "restaurant_id": "30075445" },
  { "$set": { "address.zipcode": "10463" } }
)

.updateMany(filter, update)

db.restaurants.updateMany(
  { "grades.grade": { "$not": { "$eq": "C" } } },
  { "$set": { "comment": "Ok" } }
)

.deleteMany(filter)

db.restaurants.deleteMany({ "borough": "Bronx", "cuisine": "Bakery" })

Partie 2 — Aggregation

Concepts

db.restaurants.aggregate([
  { "$match": { "borough": "Bronx" } },
  { "$group": { "_id": "$cuisine", "total": { "$sum": 1 } } },
  { "$sort": { "total": -1 } },
  { "$limit": 5 }
])

Stages (comment / ou / pourquoi + exemple)

$match

comment meme syntaxe que find • ou debut de pipeline • pourquoi reduire le volume

{ "$match": { "borough": "Bronx" } }

$unwind

comment 1 element de tableau = 1 doc • ou avant $group sur un tableau

{ "$unwind": "$grades" }

$project

comment selection/renommage/calcul • pourquoi faconner l entree du group/sort

{ "$project": { "name": 1, "date": "$grades.date", "grade": "$grades.grade" } }

$group

comment _id + accumulateurs • pourquoi stats par categorie

{ "$group": { "_id": "$cuisine", "total": { "$sum": 1 } } }

$sort

{ "$sort": { "total": -1 } }

$limit

{ "$limit": 5 }

$count

{ "$count": "n" }

Expressions

{ "$sum": 1 }
{ "$avg": "$grades.score" }
{ "$addToSet": "$restaurant_id" }
{ "$push": "$grades.grade" }
{ "$year": "$grades.date" }
{ "$divide": ["$Population", 1000000] }
{ "$size": "$restos" }

Correcteur de commande Mongo

// resultat corrige ici