Comment compter les éléments d'un document à l'intérieur d'un mongo collection avec php?
Je avoir la structure suivante d'un mongo document:
{
"_id": ObjectId("4fba2558a0787e53320027eb"),
"replies": {
"0": {
"email": ObjectId("4fb89a181b3129fe2d000000"),
"sentDate": "2012-05-21T11: 22: 01.418Z"
}
"1": {
"email": ObjectId("4fb89a181b3129fe2d000000"),
"sentDate": "2012-05-21T11: 22: 01.418Z"
}
"2" ....
}
}
Comment puis-je compter toutes les réponses de tous les documents dans la collection?
Merci!!!!
Vous devez vous connecter pour publier un commentaire.
Dans la réponse suivante, je travaille avec un ensemble de données simples avec cinq réponses à travers la collection:
Comme nous ne sommes pas simplement compter les documents, db.collection.count() ne nous aide pas à ici. Nous allons avoir besoin de recourir à MapReduce à l'analyse de chaque document et de les agréger la réponse de la matrice de longueurs. Considérez les points suivants:
La fonction map (premier argument) s'étend à travers l'ensemble de la collection et émet le nombre de réponses dans chaque document sous une constante de la clé. Mongo tiendra compte de tous émis des valeurs et exécuter la fonction de réduction (deuxième argument) un certain nombre de fois afin de les consolider (littéralement réduire) le résultat. J'espère que le code ici est simple. Si vous êtes nouveau à l'map/reduce, une mise en garde est que la réduction de la méthode doit être capable de traiter de sa propre production. Ceci est expliqué en détail dans le MapReduce docs lien ci-dessus.
Remarque: si votre collection est assez grand, vous pourriez avoir à utiliser un autre mode de sortie (par exemple, la collecte de sortie); cependant,
inline
fonctionne bien pour de petits ensembles de données.Enfin, si vous êtes en utilisant MongoDB 2.1+, nous pouvons profiter de la L'Agrégation Cadre pour éviter d'écrire JS fonctions et de rendre le tout encore plus facile:
Il y a trois choses qui se passe ici. Tout d'abord, nous dire Mongo qui nous intéresse dans le
replies
champ. Deuxièmement, nous voulons à la détente de la matrice, de sorte que nous pouvons itérer sur tous les éléments à travers les champs de notre projection. Enfin, nous allons représenter les résultats sous un "résultat" seau (toute volonté constante de le faire), l'ajout de1
à latotalReplies
résultat de chaque itération. L'exécution de cette requête donnera le résultat suivant:Bien que j'ai écrit les réponses ci-dessus à l'égard des Mongo client, vous devriez avoir aucune difficulté à les traduire en PHP. Vous aurez besoin d'utiliser MongoDB::command() à courir, soit MapReduce ou de l'agrégation des requêtes, comme le driver PHP ne dispose pas actuellement des méthodes d'assistance, soit. Il y a actuellement un MapReduce exemple dans le PHP docs, et vous pouvez référencer ce groupe Google post pour l'exécution d'une requête d'agrégation par la même méthode.
$match
pour cerner les choses à un seul document; cependant, je pense que la méthode la plus simple serait tout simplement de sélectionner le document et le compte de la longueur du tableau dans votre application. Si vous êtes inquiet au sujet de la taille des données, vous pouvez projeter un seul champ à partir de la matrice de documents incorporés (par exemple{replies.author}
), ou même un champ manquant pour obtenir un tableau d'objets vides de retour (encore dénombrable).Je n'ai pas regardé ton code, peut fonctionner aussi bien. J'ai fait le suivre et il fonctionne, tout simplement:
distinct()
devrait donner la réponse attendue. J'imagine que peut-être moins efficace (en particulier pour les grandes valeurs et les ensembles de données), que la distinction est plus complexe que summating tableau des longueurs.J'ai fait à nouveau en utilisant le groupe de commande de PHP Mongo Pilote. Il est semblable à un MapReduce commande.
Grâce jmikola pour donner des liens vers Mongo.
JSON doit être