Aller au contenu

Collections plafonnées, index TTL et curseurs#

Collections plafonnées#

Collections à taille fixe#

  • Taille déterminée à la création
  • Suppression des documents les plus anciens lorsque la taille maximale est atteinte

Rotation automatique des documents#

  • Pas besoin de gérer manuellement la suppression des documents
  • Idéal pour les données temporaires et les flux de données en temps réel

Création avec db.createCollection()#

  • Commande shell : db.createCollection("logs", {capped: true, size: 1000000, max: 1000})
  • Configuration : {capped: true, size: , max: }
  • size : taille maximale de la collection en octets
  • max : nombre maximal de documents (optionnel)

Utilisations courantes : logs, cache, flux de données en temps réel#

Exemple de code pour insérer un log :

db.logs.insertOne({ timestamp: new Date(), message: "Nouveau log", level: "info" });

Exemple de code pour récupérer les logs récents :

var logs = db.logs.find().sort({ timestamp: -1 }).limit(10);
logs.forEach(log => printjson(log));

Index TTL (Time-To-Live)#

Suppression automatique des documents après un délai spécifié#

Adapté aux données temporaires#

  • Exemples : sessions utilisateur, logs, données expirables
  • Applications : surveillance, analyse des logs, traitement de flux de données

Création d'un index TTL#

  • Utiliser la commande db.collection.createIndex()
  • Spécifier le champ de date ou Timestamp et le délai d'expiration en secondes

Exemple :

db.sessions.createIndex({ "createdAt": 1 }, { expireAfterSeconds: 3600 })

Définir le champ de date ou Timestamp lors de l'insertion du document#

Exemple d'insertion de document avec un champ "createdAt" :

db.sessions.insert({ "user": "jdoe", "createdAt": new Date() })

Fonctionnement des index TTL#

  • Le processus MongoDB supprime périodiquement les documents expirés
  • Les documents sont supprimés en fonction de leur champ de date ou Timestamp
  • Le délai d'expiration peut être modifié en utilisant collMod

Exemple pour modifier le délai d'expiration à 7200 secondes :

db.runCommand({ collMod: "sessions", index: { keyPattern: { createdAt: 1 }, expireAfterSeconds: 7200 }})

Limitations des index TTL#

  • Ne fonctionne pas sur les collections plafonnées
  • Ne supprime pas les documents si le champ de date ou Timestamp est manquant ou non valide
  • Les suppressions ne sont pas instantanées, mais effectuées lors des vérifications périodiques par MongoDB

Utilisation des curseurs Tailable#

Objectifs#

  • Curseurs persistants pour les collections plafonnées
  • Suivre les insertions en temps réel
  • Similaire à la fonctionnalité tail -f sous Unix

Création d'une collection plafonnée#

  • Commande : db.createCollection("logs", { capped: true, size: 1000000, max: 1000 })

Utilisation avec cursor.addOption(DBQuery.Option.tailable)#

  • Exemple :
var cursor = db.logs.find().sort({ $natural: -1 }).limit(1);
cursor.addOption(DBQuery.Option.tailable);
cursor.addOption(DBQuery.Option.awaitData);
while (cursor.hasNext()) {
  printjson(cursor.next());
}

Commande alternative :

db.logs.find().addOption(DBQuery.Option.tailable).addOption(DBQuery.Option.awaitData);