Mit MongoDB-Datumsangaben arbeiten

MongoDBBeginner
Jetzt üben

Einführung

In diesem Lab lernen Sie den Umgang mit Datumsangaben in MongoDB. Sie üben das Einfügen von Dokumenten mit Datumsfeldern, das Abfragen von Dokumenten innerhalb bestimmter Datumsbereiche, das Formatieren von Datumsfeldern zur Anzeige, das Aktualisieren vorhandener Datumsfelder und das Sortieren von Sammlungen nach Datum. Dieses Lab bietet eine umfassende, praktische Anleitung zu den datumsbezogenen Funktionalitäten von MongoDB, die für die Verwaltung von Zeitreihendaten, Terminplanung und Protokollierungsanwendungen unerlässlich sind.

Dokumente mit Datumsangaben einfügen

In diesem ersten Schritt verbinden Sie sich mit dem MongoDB-Server und fügen mehrere Dokumente ein, die Datumsangaben enthalten. Dies bildet die Grundlage für die Abfragen und Operationen, die Sie in späteren Schritten durchführen werden.

Öffnen Sie zunächst die MongoDB-Shell, indem Sie den Befehl mongosh in Ihrem Terminal ausführen. Dadurch wird eine Verbindung zu Ihrer laufenden MongoDB-Instanz hergestellt.

mongosh

Sobald Sie sich in der Shell befinden, sehen Sie eine Eingabeaufforderung wie test>. Wechseln wir zu einer neuen Datenbank namens datelab. Wenn die Datenbank nicht existiert, erstellt MongoDB sie für Sie, sobald Sie die ersten Daten einfügen.

use datelab

Nun fügen Sie drei Dokumente in eine neue Sammlung namens events ein. Jedes Dokument repräsentiert ein Ereignis und enthält ein Datum. MongoDB speichert Datumsangaben als BSON Date-Objekte, die Sie mit dem Konstruktor new Date() erstellen können.

Fügen Sie die folgenden Dokumente einzeln ein. Das erste verwendet einen ISO-8601-Datumsstring, das zweite die aktuelle Datums- und Uhrzeitangabe und das dritte einen Unix-Timestamp in Millisekunden.

db.events.insertOne({
    event_name: "Conference",
    date: new Date("2024-06-15T10:30:00Z")
})
db.events.insertOne({
    event_name: "System Maintenance",
    timestamp: new Date()
})
db.events.insertOne({
    event_name: "Project Deadline",
    timestamp: new Date(1718476800000)
})

Nach dem Einfügen der Dokumente können Sie überprüfen, ob sie korrekt hinzugefügt wurden, indem Sie die Methode find() verwenden, die alle Dokumente aus der Sammlung abruft.

db.events.find()

Ihre Ausgabe sollte in etwa wie folgt aussehen, obwohl die _id-Werte und der timestamp für "System Maintenance" bei Ihnen unterschiedlich sein werden.

[
  {
    _id: ObjectId("65d38f8a1c2d3e4f5a6b7c8d"),
    event_name: 'Conference',
    date: ISODate('2024-06-15T10:30:00.000Z')
  },
  {
    _id: ObjectId("65d38f9c1c2d3e4f5a6b7c8e"),
    event_name: 'System Maintenance',
    timestamp: ISODate('2024-02-19T14:55:24.123Z')
  },
  {
    _id: ObjectId("65d38fb11c2d3e4f5a6b7c8f"),
    event_name: 'Project Deadline',
    timestamp: ISODate('2024-06-15T18:00:00.000Z')
  }
]

Sie haben nun erfolgreich Dokumente mit Datumsangaben eingefügt. Im nächsten Schritt lernen Sie, wie Sie diese Dokumente basierend auf ihren Datumsangaben abfragen.

Dokumente nach Datumsbereich abfragen

Mit Daten in Ihrer Sammlung können Sie nun Abfragen durchführen, um Dokumente zu finden, die in bestimmte Datumsbereiche fallen. Dies ist eine häufige Anforderung für Anwendungen, die geplante Ereignisse, Protokolle oder zeitkritische Daten verarbeiten.

Fügen wir zunächst weitere Ereignisse zu unserer Sammlung hinzu, um die Abfragen interessanter zu gestalten. Wir verwenden die Methode insertMany(), um drei Dokumente auf einmal hinzuzufügen.

db.events.insertMany([
    {
        event_name: "Summer Conference",
        date: new Date("2024-07-15T09:00:00Z")
    },
    {
        event_name: "Winter Workshop",
        date: new Date("2024-01-20T14:30:00Z")
    },
    {
        event_name: "Spring Meetup",
        date: new Date("2024-04-10T11:15:00Z")
    }
])

Nun haben Sie insgesamt sechs Ereignisse. Suchen wir alle Ereignisse, die nach dem 1. Juni 2024 stattgefunden haben. Dazu verwenden Sie den Operator "größer als", $gt.

db.events.find({
    date: { $gt: new Date("2024-06-01") }
})

Als Nächstes suchen wir alle Ereignisse, die in der ersten Hälfte des Jahres 2024 stattgefunden haben, genauer gesagt zwischen dem 1. Januar und dem 1. Juni. Dazu können Sie die Operatoren "größer als oder gleich" ($gte) und "kleiner als" ($lt) kombinieren.

db.events.find({
    date: {
        $gte: new Date("2024-01-01"),
        $lt: new Date("2024-06-01")
    }
})

Die Abfrage gibt die Ereignisse "Winter Workshop" und "Spring Meetup" zurück. Die Ausgabe sollte wie folgt aussehen:

[
  {
    _id: ObjectId("65d392a11c2d3e4f5a6b7c91"),
    event_name: 'Winter Workshop',
    date: ISODate('2024-01-20T14:30:00.000Z')
  },
  {
    _id: ObjectId("65d392a11c2d3e4f5a6b7c92"),
    event_name: 'Spring Meetup',
    date: ISODate('2024-04-10T11:15:00.000Z')
  }
]

Diese Beispiele zeigen, wie Vergleichsoperatoren ($gt, $gte, $lt, $lte) verwendet werden, um Dokumente basierend auf Datumsfeldern effektiv zu filtern.

Datumsformatierung mit Aggregation

Oft müssen Sie Datumsangaben in einem bestimmten, für Menschen lesbaren Format anzeigen. Das Aggregations-Framework von MongoDB bietet hierfür leistungsstarke Werkzeuge. In diesem Schritt verwenden Sie den Operator $dateToString, um Ihre Datumsfelder zu formatieren.

Das Aggregations-Framework verarbeitet Dokumente durch eine Pipeline von Stufen (Stages). Wir verwenden eine $project-Stufe, um unsere Dokumente neu zu gestalten und ein neues, formatiertes Datumsfeld zu erstellen.

Formatieren wir das Feld date unserer Ereignisse in das Format JJJJ-MM-TT. Diese Abfrage verarbeitet nur die Dokumente, die ein Feld date enthalten.

db.events.aggregate([
    {
        $project: {
            event_name: 1,
            formatted_date: {
                $dateToString: {
                    format: "%Y-%m-%d",
                    date: "$date"
                }
            }
        }
    }
])

Lassen Sie uns diesen Befehl aufschlüsseln:

  • db.events.aggregate([...]): Initiiert eine Aggregations-Pipeline für die Sammlung events.
  • $project: Eine Stufe, die Dokumente neu formatiert. Wir schließen event_name ein und erstellen ein neues Feld formatted_date.
  • $dateToString: Ein Operator, der ein Datumsobjekt in einen String umwandelt.
  • format: "%Y-%m-%d": Gibt das Ausgabeformat an. %Y steht für das Jahr, %m für den Monat und %d für den Tag.
  • date: "$date": Gibt das Eingabedatumsfeld aus dem ursprünglichen Dokument an. Das Präfix $ kennzeichnet einen Feldpfad.

Die Ausgabe zeigt den ursprünglichen Ereignisnamen und den neu formatierten Datumsstring. Beachten Sie, dass Dokumente ohne ein Feld date (wie "System Maintenance") aus dem Ergebnis ausgeschlossen werden.

[
  { _id: ObjectId("..."), event_name: 'Conference', formatted_date: '2024-06-15' },
  { _id: ObjectId("..."), event_name: 'Summer Conference', formatted_date: '2024-07-15' },
  { _id: ObjectId("..."), event_name: 'Winter Workshop', formatted_date: '2024-01-20' },
  { _id: ObjectId("..."), event_name: 'Spring Meetup', formatted_date: '2024-04-10' }
]

Sie können auch einzelne Komponenten eines Datums, wie das Jahr oder den Monat, mit Operatoren wie $year und $month extrahieren.

db.events.aggregate([
    {
        $project: {
            event_name: 1,
            year: { $year: "$date" },
            month: { $month: "$date" },
            day: { $dayOfMonth: "$date" }
        }
    }
])

Dies gibt Ihnen eine detaillierte Kontrolle darüber, wie Sie Datumsangaben verarbeiten und präsentieren.

Datumsfelder aktualisieren

Ihre Daten sind nicht immer statisch. Möglicherweise müssen Sie Datumsfelder aktualisieren, z. B. ein Ereignis neu planen oder einen Änderungszeitstempel hinzufügen. In diesem Schritt lernen Sie, wie Sie Datumsfelder mit verschiedenen Update-Operatoren aktualisieren.

Lassen Sie uns zunächst das Ereignis "Conference" auf ein neues Datum verschieben. Wir verwenden die Methode updateOne(), um ein einzelnes Dokument anzusprechen, und den Operator $set, um sein Feld date zu ändern.

db.events.updateOne(
    { event_name: "Conference" },
    {
        $set: {
            date: new Date("2024-09-01T10:00:00Z"),
            status: "Rescheduled"
        }
    }
)

Führen wir nun ein Bulk-Update durch. Wir markieren alle Ereignisse, die vor dem 1. Mai 2024 stattgefunden haben, als "Archived". Wir fügen auch ein neues Feld hinzu, last_modified, um aufzuzeichnen, wann diese Aktualisierung stattgefunden hat. Die Methode updateMany() modifiziert alle übereinstimmenden Dokumente, und der Operator $currentDate ist perfekt geeignet, um ein Feld auf die aktuelle Serverzeit zu setzen.

db.events.updateMany(
    { date: { $lt: new Date("2024-05-01") } },
    {
        $set: { status: "Archived" },
        $currentDate: { last_modified: true }
    }
)

Überprüfen wir die Änderungen, indem wir alle Dokumente abrufen. Die Methode .pretty() ist veraltet, daher verwenden wir einfach find().

db.events.find()

Sie werden sehen, dass die "Conference" ein neues Datum und einen neuen Status hat. Der "Winter Workshop" und der "Spring Meetup" sind nun als "Archived" markiert und haben einen last_modified-Zeitstempel.

Beispielausgabe für ein archiviertes Ereignis:

{
 "_id" : ObjectId("..."),
 "event_name" : "Winter Workshop",
 "date" : ISODate("2024-01-20T14:30:00Z"),
 "status" : "Archived",
 "last_modified" : ISODate("2024-02-19T15:10:00Z")
}

Diese Operationen zeigen, wie Sie datumsbezogene Informationen in Ihren Dokumenten präzise ändern können.

Dokumente nach Datum sortieren

Die letzte grundlegende Operation, die Sie lernen werden, ist das Sortieren. Ereignisse in chronologischer Reihenfolge anzuzeigen, ist eine gängige Anforderung. MongoDB erleichtert das Sortieren Ihrer Abfrageergebnisse nach jedem Feld, einschließlich Datumsangaben.

Um Dokumente zu sortieren, hängen Sie die Methode .sort() an eine find()-Abfrage an. Die Methode sort() nimmt ein Dokument entgegen, das das zu sortierende Feld und die Sortierreihenfolge angibt. Ein Wert von 1 bedeutet aufsteigende Reihenfolge (vom frühesten zum spätesten), und -1 bedeutet absteigende Reihenfolge (vom spätesten zum frühesten).

Rufen wir alle Ereignisse ab, sortiert nach ihrem date in aufsteigender Reihenfolge.

db.events.find().sort({ date: 1 })

Dies listet die Ereignisse vom "Winter Workshop" (frühestes) bis zur "Summer Conference" (spätestes) auf. Dokumente ohne ein Feld date werden zuerst sortiert, wenn sie in die Abfrage einbezogen werden.

Sortieren wir nun die Ereignisse in absteigender Reihenfolge, um die aktuellsten Ereignisse zuerst zu sehen.

db.events.find().sort({ date: -1 })

Sie können das Sortieren auch mit Filtern kombinieren. Finden wir zum Beispiel alle Ereignisse, die nicht archiviert sind, und sortieren wir sie nach Datum.

db.events.find({ status: { $ne: "Archived" } }).sort({ date: 1 })

Die Ausgabe zeigt die nicht archivierten Ereignisse in chronologischer Reihenfolge.

[
  {
    _id: ObjectId("..."),
    event_name: 'System Maintenance',
    timestamp: ISODate("...")
  },
  {
    _id: ObjectId("..."),
    event_name: 'Project Deadline',
    timestamp: ISODate('2024-06-15T18:00:00.000Z')
  },
  {
    _id: ObjectId("..."),
    event_name: 'Summer Conference',
    date: ISODate('2024-07-15T09:00:00.000Z')
  },
  {
    _id: ObjectId("..."),
    event_name: 'Conference',
    date: ISODate('2024-09-01T10:00:00.000Z'),
    status: 'Rescheduled'
  }
]

Sortieren ist ein entscheidendes Werkzeug, um zeitlich geordnete Daten sinnvoll darzustellen. Wenn Sie fertig sind, können Sie die MongoDB-Shell verlassen, indem Sie exit eingeben oder Strg+D drücken.

Zusammenfassung

In diesem Lab haben Sie die grundlegenden Techniken für die Arbeit mit Datumsangaben in MongoDB gelernt. Sie haben damit begonnen, Dokumente mit Datumsangaben in verschiedenen Formaten einzufügen. Anschließend haben Sie geübt, Dokumente basierend auf Datumsbereichen mit Vergleichsoperatoren abzufragen. Danach haben Sie das Aggregations-Framework erkundet, um Datumsfelder für eine bessere Lesbarkeit zu formatieren. Sie haben auch gelernt, wie Sie Datumsfelder aktualisieren und Änderungszeitstempel hinzufügen. Schließlich haben Sie das Sortieren von Sammlungen nach Datum gemeistert, um Daten in chronologischer Reihenfolge darzustellen. Diese Fähigkeiten sind für jeden Entwickler, der mit zeitbasierten Daten in MongoDB arbeitet, unerlässlich.