Gibt es eine Abfrage zum Berechnen, wie viele unterschiedliche Werte ein Feld in der Datenbank enthält?
zB Ich habe ein Feld für Land und es gibt 8 Arten von Länderwerten (Spanien, England, Frankreich usw.)
Wenn jemand mehr Dokumente mit einem neuen Land hinzufügt, möchte ich, dass die Abfrage 9 zurückgibt.
Gibt es einen einfacheren Weg als gruppieren und zählen?
Antworten:
MongoDB verfügt über einen
distinct
Befehl, der ein Array unterschiedlicher Werte für ein Feld zurückgibt. Sie können die Länge des Arrays auf eine Anzahl überprüfen.Es gibt auch einen Shell-
db.collection.distinct()
Helfer:quelle
Hier ist ein Beispiel für die Verwendung der Aggregations-API. Um den Fall zu verkomplizieren, gruppieren wir nach Wörtern, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird, aus der Array-Eigenschaft des Dokuments.
das ergeben Ergebnis wie
quelle
unwind
ist erforderlich, da der Code einzelne Werte eines Array-Felds gruppiert, die der Funktionsweise entsprechendistinct
.unwind
ist erforderlich, wenn Sie mit Arrays arbeiten.Mit MongoDb 3.4.4 und neuer können Sie die Verwendung eines
$arrayToObject
Operators und einer$replaceRoot
Pipeline nutzen, um die Anzahl zu ermitteln .Angenommen, Sie haben eine Sammlung von Benutzern mit unterschiedlichen Rollen und möchten die unterschiedlichen Anzahlen der Rollen berechnen. Sie müssten die folgende aggregierte Pipeline ausführen:
Beispielausgabe
quelle
.distinct()
.Sie können Mongo Shell Extensions nutzen . Es ist ein einzelner .js-Import, den Sie an Ihren
$HOME/.mongorc.js
oder programmgesteuert anhängen können , wenn Sie auch in Node.js / io.js codieren.Stichprobe
Für jeden einzelnen Wert der Feldanzahl werden die Vorkommen in Dokumenten optional nach Abfrage gefiltert
Der Feldparameter kann ein Array von Feldern sein
quelle
require("./script.js")
Ich nehme an.mongorc.js
Datei im Grunde genommen in Ihrem Home-Verzeichnis ab. Getan.Um
field_1
in der Sammlung etwas Besonderes zu finden , wollen wir aber auch eineWHERE
Bedingung, die wir nicht wie folgt tun können:db.your_collection_name.distinct('field_1', {WHERE condition here and it should return a document})
Suchen Sie also eine Nummer, die sich
names
von einer Sammlung unterscheidet, bei der das Alter> 25 wie folgt lautet:db.your_collection_name.distinct('names', {'age': {"$gt": 25}})
Ich hoffe es hilft!
quelle