Question

Je le document comme celui-ci:

{
   "_id": ObjectId("4d17c7963ffcf60c1100002f"),
   "title": "Text",
   "params": {
     "brand": "BMW",
     "model": "i3"
    }
}

{
   "_id": ObjectId("4d17c7963ffcf60c1100002f"),
   "title": "Text",
   "params": {
     "brand": "BMW",
     "model": "i5"
    }
}

Qu'est-ce que j'ai besoin est le nombre de toutes les valeurs de params. comme:

brand
---------
BMW (2)

model
---------
i3 (1)
i5 (1)

Je pense que je dois à la carte d'écriture / réduire les fonctions. Comment puis-je faire ceci? Merci.

Était-ce utile?

La solution

  

Je pense que je dois à la carte d'écriture / réduire les fonctions.

Oui, vous avez besoin d'un plan-reduce pour cela. Pour quelques-carte réduire des exemples simples, s'il vous plaît regarder ici .

Pour votre cas particulier, vous devez d'abord changer votre attente de la sortie. La sortie de la map / reduce est une collection. La collection regardera (dans votre cas) quelque chose comme ceci:

{ key : { 'brand' : 'bmw' }, value : 2 }
{ key : { 'model' : 'i5' }, value : 1 }

Pour générer cet ensemble, vous aurez besoin d'une fonction « carte » et une fonction « réduire ». La fonction « carte » émet une clé et une valeur. La clé est chaque élément de params, la valeur est le nombre de 1. La fonction « réduire » accepte une clé et un tableau de valeurs et retourne une seule valeur. Votre question est fondamentalement la même que cet exemple sur le MongoDB le site :

map = function() {
    if (!this.params) {
        return;
    }
    for (index in this.params) {
        emit(this.params[index], 1);
    }
}

reduce = function(previous, current) {
    var count = 0;

    for (index in current) {
        count += current[index];
    }

    return count;
}

Autres conseils

Dans votre fonction carte énumèrent les propriétés de la propriété params de l'objet this. Pour chaque propriété, vous trouverez appel emit avec une clé qui contient à la fois le nom de la propriété et la valeur de la propriété. Passe 1 comme valeur. par exemple. emit({'brand','BMW'}, 1) mais de toute évidence en utilisant des variables non constantes!

Dans votre fonction reduce vous passé une clé et un tableau de valeurs. Somme ces valeurs et retourner la somme. Même si le tableau initial sera tous des 1 ne soyez pas tentés d'utiliser la longueur du tableau parce que la réduction peut être appelée de manière itérative.

Vous pouvez regrouper les résultats par la suite de la collection de résultat, l'application d'un indice si nécessaire pour la performance.

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