MongoDB php obtenir des valeurs uniques champs
-
28-09-2019 - |
Question
Je suis en train d'obtenir une liste de valeurs uniques du champ « type » de ma collection de MongoDB. Exemples de documents ci-dessous:
{
"_id" : ...,
"type" : "report",
"tasks" : ...
}
{
"_id" : ...,
"type" : "research",
"tasks" : ...
}
{
"_id" : ...,
"type" : "memo",
"tasks" : ...
}
{
"_id" : ...,
"type" : "memo",
"tasks" : ...
}
{
"_id" : ...,
"type" : "report",
"tasks" : ...
}
{
"_id" : ...,
"type" : "report",
"tasks" : ...
}
Je cherche, par ordre de fréquence, les types uniques qui sont dans le domaine du type des documents, donc:
["report", "memo", "research"]
Quelle est la meilleure façon de le faire? Espérons que je peux le faire en questionnant avec mongo et non le téléchargement de la collection ...
La solution
Sur une norme SQL SGBD ce sera fait avec la requête suivante:
SELECT type, count(*) as ct FROM table GROUP BY type ORDER BY ct;
sur MongoDB ce serait fait en utilisant la fonction de groupe, même si elle est un peu plus compliqué:
db.collection.group(
{key: { "type":true},
reduce: function(obj,prev) { prev.count += 1; },
initial: { count: 0 }
});
Ici, je demande la db pour renvoyer des valeurs pour le « type » clé (d'où le « vrai »), et pour chaque valeur, la donnée réduire fonction sera utilisée pour agréger les enregistrements. Ici, je suis juste mettre à jour un compte de combien de fois chaque enregistrement apparaît. Si vous exécutez cette requête, vous obtenez quelque chose comme ceci:
[
{
"type" : "report",
"count" : 5
},
{
"type" : "memo",
"count" : 15
}
{
"type" : "research",
"count" : 3
}
]
Vous remarquerez que ce n'est pas commandé; même les MongoDB docs disent que la meilleure façon de le commander est de le faire côté client.
Autres conseils
Vous pouvez utiliser distincts: http://www.mongodb.org/display / DOCS / agrégation # agrégation-Distinct
Il y a un exemple dans le 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";
}
Je ne sais pas si les résultats sont classés par fréquence.