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 ...

Était-ce utile?

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.

La documentation pertinente est .

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top