Ich habe die Aggregation zum Abrufen von Datensätzen aus Mongodb verwendet.
$result = $collection->aggregate(array(
array('$match' => $document),
array('$group' => array('_id' => '$book_id', 'date' => array('$max' => '$book_viewed'), 'views' => array('$sum' => 1))),
array('$sort' => $sort),
array('$skip' => $skip),
array('$limit' => $limit),
));
Wenn ich diese Abfrage unbegrenzt ausführe, werden 10 Datensätze abgerufen. Aber ich möchte das Limit auf 2 halten. Also möchte ich die Gesamtzahl der Datensätze erhalten. Wie kann ich mit Aggregation umgehen? Bitte berate mich. Vielen Dank
Antworten:
Dies ist eine der am häufigsten gestellten Fragen, um das paginierte Ergebnis und die Gesamtzahl der Ergebnisse gleichzeitig in einer einzelnen Abfrage zu erhalten. Ich kann nicht erklären, wie ich mich gefühlt habe, als ich es endlich erreicht habe. LOL.
Das Ergebnis sieht ungefähr so aus:
quelle
{ $group: { _id: null, count: { $sum:1 }, result: { $push: '$$ROOT' }}}
(füge nach ein,{$group:{}}
um die Gesamtzahl zu finden.Seit v.3.4 (glaube ich) hat MongoDB jetzt einen neuen Aggregationspipeline-Operator namens ' facet ', der in eigenen Worten:
In diesem speziellen Fall bedeutet dies, dass man so etwas tun kann:
Das Ergebnis ist (mit beispielsweise 100 Gesamtergebnissen):
quelle
$project
?Verwenden Sie diese Option, um die Gesamtzahl in der resultierenden Sammlung zu ermitteln.
quelle
Sie können die toArray-Funktion verwenden und dann ihre Länge für die Gesamtzahl der Datensätze abrufen.
quelle
TypeError: Parent.aggregate(...).toArray is not a function
Dies ist der Fehler, den ich bei dieser Lösung gegeben habe.Verwenden Sie die Pipeline-Phase $ count Aggregation , um die Gesamtanzahl der Dokumente abzurufen:
Abfrage:
Ergebnis:
quelle
Ich habe es so gemacht:
Das Aggregat gibt das Array zurück, also schleifen Sie es einfach und erhalten Sie den endgültigen Index.
Und eine andere Möglichkeit ist:
quelle
var
Erklärung noch denmap
Anruf. Die ersten 3 Zeilen Ihres ersten Beispiels sind ausreichend.Die von @Divergent bereitgestellte Lösung funktioniert, aber meiner Erfahrung nach ist es besser, zwei Abfragen zu haben:
Die Lösung durch Drücken von $$ ROOT und Verwenden von $ Slice führt zu einer Dokumentenspeicherbeschränkung von 16 MB für große Sammlungen. Bei großen Sammlungen scheinen zwei Abfragen zusammen schneller zu laufen als die mit $$ ROOT Pushing. Sie können sie auch parallel ausführen, sodass Sie nur durch die langsamere der beiden Abfragen (wahrscheinlich die sortierte) eingeschränkt sind.
Ich habe mich mit dieser Lösung unter Verwendung von 2 Abfragen und einem Aggregationsframework abgefunden (Hinweis - in diesem Beispiel verwende ich node.js, aber die Idee ist dieselbe):
quelle
quelle
Dies kann für mehrere Spielbedingungen funktionieren
quelle
Ich brauchte die absolute Gesamtzahl nach dem Anwenden der Aggregation. Das hat bei mir funktioniert:
Ergebnis:
quelle
Hier sind einige Möglichkeiten, um die Gesamtzahl der Datensätze während der MongoDB-Aggregation zu ermitteln:
Verwenden von
$count
:Für 1000 Datensätze dauert dies durchschnittlich 2 ms und ist der schnellste Weg.
Verwenden von
.toArray()
:Für 1000 Datensätze dauert dies durchschnittlich 18 ms.
Verwenden von
.itcount()
:Für 1000 Datensätze dauert dies durchschnittlich 14 ms.
quelle
Entschuldigung, aber ich denke, Sie brauchen zwei Fragen. Eine für Gesamtansichten und eine für gruppierte Datensätze.
Sie können diese Antwort nützlich finden
quelle
Wenn Sie nicht gruppieren möchten, verwenden Sie die folgende Methode:
db.collection.aggregate( [ { $match : { score : { $gt : 70, $lte : 90 } } }, { $count: 'count' } ] );
quelle