Abfragen
Abfragen können wir mit der find()
-Methode machen.
db.inventory.find()
Filtern
Wir können der find()
-Methode ein Objekt mit Bedingungen mitgeben, um nach bestimmten Kriterien zu filtern.
db.inventory.find( { status: "D" } )
AND-Condition
Um eine AND-Condition in unsere Query hinzuzufügen, müssen wir unseren Bedingungen mit Kommas trennen.
db.inventory.find( { status: "A", qty: { $lt: 30 } } )
OR-Condition
Um eine OR-Condition in unsere Query hinzuzufügen, müssen wir den $or
-Operator nutzen.
db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } )
Operatoren
$eq
Vergleicht Werte, die gleich einem angegebenen Wert sind.
$ne
Vergleicht Werte, die nicht gleich einem angegebenen Wert sind.
$gt
Vergleicht Werte, die grösser als ein angegebener Wert sind.
$gte
Vergleicht Werte, die grösser oder gleich einem angegebenen Wert sind.
$lt
Vergleicht Werte, die kleiner als ein angegebener Wert sind.
$lte
Vergleicht Werte, die kleiner oder gleich einem angegebenen Wert sind.
$in
Vergleicht Werte, die einem der in einem Array angegebenen Werte entsprechen.
$nin
Vergleicht Werte, die keinem der in einem Array angegebenen Werte entsprechen.
Verschachtelte Dokumente
db.inventory.find( { "size.uom": "in" } )
Der Schlüssel muss in ""
stehen.
Keys selektieren
Mit einem zweiten Objekt in der find()
-Funktion können wir bestimmen, welche Daten zurückgegeben werden sollen und welche nicht.
db.inventory.find( { status: "A" }, { item: 1, status: 1 } )
Sortieren
Um zu sortieren, nutzen wir die sort()
-Funktion. Dabei steht 1
für Ascending und -1
für Descending.
db.inventory.find().sort( { "qty": 1} )
Natürlich kann auch auf mehreren Sortierebenen sortiert werden.
db.inventory.find().sort( { "status": 1, "item": 1 } )
Aggregation
Aggregation ist eine Methode um eine grosse Anzahl verschiedenener Dokumente einer Collection zu bearbeiten und auszuwerten. Eine Aggregation durchläuft eine oder mehrere Stages (Einzeloperationen), mit welchen gefiltert, sortiert, groupiert oder modifiziert werden kann. Der häufigste Anwendungsfall ist die Berechnung von Summen, Durchschnitten, Minium, oder Maximum.
Konzept
Jede Aggregation Pipeline besteht aus mehreren Stages, welche die Dokumente bearbeiten. Die Stages sind ein einem Array
[..]
angeordnetJede Stage bearbeitet ihre Inputdokumente. Zum Beispiel kann eine Stage Filteroperationen ausführen oder Dokumente gruppieren und bestimmte Werte berechnen.
Die Output Dokumente einer Stage dienen als Input Dokumente für die nächste Stage. Eine Aggregation Pipeline gleicht daher einer klassischen Unix Pipeline.
Eine Aggregation Pipeline kann Resultate für Gruppen von Dokumenten zurückliefern, z.B. Anzahl, Summe, Durchschnitt, Minimum und Maximum.
Syntax
db.<collection>.aggregate([ { <stage> }, ... ])
Stages
$match
$match
Filtert Dokumente nach den gegebenen Kriterien.
$match: {
$or: [
{ score: { $gt: 70, $lt: 90 } },
{ views: { $gte: 1000 } }
]
}
$group
$group
Gruppiert die Dokumente nach einem Datenfeld . Folgende Aggregationsfunktionen stehen zur Verfügung:
$avg
$sum
$count
$min
$max
$first
$last
...
$group: {
_id: "$name",
totalQuantity: { $sum: "$quantity" }
}
$sort
$sort
Sortiert die Dokumente nach dem angegebenen Feld.
$sort : {
age : -1,
posts: 1
}
$project
$project
Fügt neue Felder zu den Dokumenten hinzu oder unterdrückt sie:
<field>: 1
- übernimmt das angegebene Feld<field>: 0
- unterdrückt das angegebene Feld<field>: <expression>
- fügt ein Feld hinzu oder ersetzt es
$project : {
size: 1,
_id: 0,
name: { $toUpper: "$_id" }
}
$out
$out
Schreibt Dokumente in eine Collection.
$out: "authors"
$unwind
$unwind
Dekonstruiert ein Array-Feld und erstellt für jedes Element im Array ein separates Dokument.
$unwind: "$copies"
Beispiele
Für wie viele CHF hat jeder Kunde mit dem Status A eingekauft?
db.orders.aggregate([
{
$match: { status: "A" }
},
{
$group: { _id: "$cust_id", order_totals: { $sum: "$amount" } }
}
])
Wie viele Pizzen mit der Grösse Medium wurden von jeder Sorte bestellt?
db.orders.aggregate([
{
$match: { size: "medium" }
},
{
$group: { _id: "$name", totalQuantity: { $sum: "$quantity" } }
}
])
Für wie viele Franken wurde zwischen dem 30. Januar 2020 und dem 30. Januar 2020 pro Tag bestellt?
db.orders.aggregate([
{
$match: {
"date": { $gte: new ISODate( "2020-01-30" ), $lt: new ISODate( "2022-01-30" ) }
}
},
{
$group: {
_id: { $dateToString: { format: "%Y-%m-%d", date: "$date" } },
totalOrderValue: { $sum: { $multiply: [ "$price", "$quantity" ] } },
}
},
{
$sort: { totalOrderValue: -1 }
}
])
Zuletzt aktualisiert
War das hilfreich?