Home » Webentwicklung » Paginierung auf Arrays – MongoDB

Paginierung auf Arrays – MongoDB

In diesem Tutorial zeigen wir Ihnen, wie Sie in MongoDB eine Paginierung für Dokumentarrays durchführen können.

Wenn Sie über eine sehr große Datenbank verfügen, kann das Abrufen aller Dokumente in einer Abfrage sehr langsam sein. Aber wir haben eine Lösung: Seitennummerierung. Es ermöglicht Ihnen, einige Datensätze in einer Abfrage und die nächsten paar in einer anderen Abfrage abzurufen. Wenn Sie beispielsweise 1000 Benutzer haben, ruft die erste Abfrage Benutzer von 0 bis 100 ab, die zweite Abfrage ruft Benutzer von 101 bis 200 ab und so weiter.

Problem

Die Paginierung bringt ein Problem mit sich; wenn Daten in Arrays gespeichert werden. In Mongo DB werden die Daten im JSON-Format gespeichert. Möglicherweise speichern Sie Daten in Arrays. Nehmen Sie zum Beispiel das folgende Dokument:

db.collection("users").insertOne({
	name: "Adnan",
	workouts: [{
		name: "Push ups",
		sets: 10,
		reps: 30
	}, {
		name: "Pull ups",
		sets: 7,
		reps: 10
	}, {
		name: "Crunches",
		sets: 5,
		reps: 50
	}, {
		name: "Deadlifts",
		sets: 3,
		reps: 15
	}, {
		name: "Shoulder press",
		sets: 8,
		reps: 8
	}]
})

Hier enthält ein Dokument eine Reihe von „Workouts“ und möglicherweise viel mehr Daten. Der oben erstellte Benutzer verfügt beispielsweise über fünf Array-Elemente „Workouts“, Sie möchten jedoch bei jeder Abfrage zwei Workouts anzeigen. Wenn Sie die reguläre Abfrage ausführen, um das Benutzerdokument abzurufen, werden alle fünf Trainingseinheiten zurückgegeben:

// not a solution

// return the whole object
const data = await db.collection("users").find({
	name: "Adnan"
}).toArray()
console.log(data[0])

Es wird jedoch das gesamte Objekt mit allen fünf „Trainings“-Elementen zurückgegeben, was nicht das gewünschte Ergebnis ist.

Wie werden Sie das also paginieren?

Lösung

Hier ist die Mongo DB $slice Operator kommt ins Spiel. Es funktioniert genauso wie das Javascript Scheibe() Funktion. Es schneidet das Array aus den bereitgestellten Start- und Endwerten ab. Daher werden wir die folgende Abfrage verwenden, um das Benutzerdokument abzurufen, allerdings mit ein paar Übungen:

// solution

// return the first 2 workouts
const data = await db.collection("users").find({
	name: "Adnan"
}, {
	projection: {
		workouts: {
			$slice: [0, 2]
		}
	}
}).toArray()
console.log(data[0])

Der Slice-Startwert funktioniert bei Indizes, daher bedeutet 0 das erste Element des Arrays und das Ende die Anzahl der abzurufenden Elemente. Es werden also zwei Array-Elemente ab Index 0 abgerufen.

Der zweite Parameter zum finden() Die Funktion teilt der Projektion mit, welche Schlüssel Sie abrufen möchten. Sie müssen alle Ihre Schlüsselnamen in das „Projektions“-Objekt schreiben. Wenn Sie nun die nächsten beiden Datensätze abrufen möchten, können Sie einfach Folgendes tun:

// return the workouts from 2 to 4 
const data = await db.collection("users").find({
	name: "Adnan"
}, {
	projection: {
		workouts: {
			$slice: [2, 2]
		}
	}
}).toArray()
console.log(data[0])

Der „Start“ ist auf 2 gesetzt, was bedeutet, dass das Array bei Index 2 beginnt, dem dritten Element des Arrays. Weil das erste und das zweite bereits in der vorherigen Abfrage abgerufen wurden. Das „Ende“ wird wieder auf 2 gesetzt, sodass wir erneut die beiden Datensätze aus dem Array abrufen.

So können Sie weiterhin die Paginierung für die Arrays Ihres Dokuments in MongoDB implementieren. Wenn Sie bei der Befolgung dieser Anleitung auf Probleme stoßen, lassen Sie es mich bitte wissen.


Beitragsaufrufe: 28