mongodb php bekommen Felder eindeutige Werte
-
28-09-2019 - |
Frage
Ich versuche, aus meiner mongodb Sammlung eine Liste von eindeutigen Werten aus dem ‚Typ‘ Feld zu bekommen. Beispiel Dokumente unter:
{
"_id" : ...,
"type" : "report",
"tasks" : ...
}
{
"_id" : ...,
"type" : "research",
"tasks" : ...
}
{
"_id" : ...,
"type" : "memo",
"tasks" : ...
}
{
"_id" : ...,
"type" : "memo",
"tasks" : ...
}
{
"_id" : ...,
"type" : "report",
"tasks" : ...
}
{
"_id" : ...,
"type" : "report",
"tasks" : ...
}
Ich suche, durch Frequenz bestellt, die einzigartigen Typen, die in dem Typ-Feld der Dokumente sind, so:
["report", "memo", "research"]
Was ist der beste Weg, dies zu tun? Hoffentlich kann ich dies tun, indem mit Mongo Abfrage und nicht die gesamte Sammlung Download ...
Lösung
Auf einem Standard-SQL-DBMS dies würde mit der folgenden Abfrage durchgeführt werden:
SELECT type, count(*) as ct FROM table GROUP BY type ORDER BY ct;
auf mongodb dies geschehen würde, um die Gruppenfunktion verwenden, obwohl es ist etwas komplizierter:
db.collection.group(
{key: { "type":true},
reduce: function(obj,prev) { prev.count += 1; },
initial: { count: 0 }
});
Hier frage ich die dB-Wert für den Schlüssel „type“ zurückzukehren (daher das „true“), und für jeden Wert, der zu reduzieren gegebene Funktion verwendet werden, um die gefundenen Datensätze zu aggregieren. Hier bin ich die Aktualisierung nur zu zählen, wie oft jeder Datensatz angezeigt wird. Wenn Sie diese Abfrage ausführen werden Sie etwas wie diese:
[
{
"type" : "report",
"count" : 5
},
{
"type" : "memo",
"count" : 15
}
{
"type" : "research",
"count" : 3
}
]
Sie werden bemerken, das nicht bestellt wird; selbst die mongodb docs sagen, dass der einfachste Weg, um zu bestellen ist es Client-Seite zu tun.
Relevante Dokumentation ist hier .
Andere Tipps
Sie können verschiedene verwenden: http://www.mongodb.org/display / docs / Aggregation # Aggregation-Distinct
Es gibt ein Beispiel in der PHP-doc: http://php.net/manual /en/mongodb.command.php
$types = $db->command(array("distinct" => "yourCollection", "key" => "type"));
foreach ($types['values'] as $type) {
echo "$type\n";
}
Ich weiß nicht, ob die Ergebnisse durch Frequenz bestellt werden.