2011-02-25 3 views
0

Je voudrais MapReduce données que j'ai dans MongoDB. Les données sont comme ceci:Utilisation de RegExp dans la fonction de carte

{ 
    type: 'DOMcheck', 
    category: 'Bad label name', 
    url: 'http://s1.app.int/part/module/doc/2' 
    ... 
} 

Maintenant, je voudrais recueillir tous les journaux et compter uniqs par /part/module partie de l'URL. Je crée la fonction map:

function() { 
    var re = new RegExp(/^(http:\/\/[\w\.]*)(\/[\w]*\/[\w]*)/), 
     u = []; 
    u = this.url.match(re); 
    emit(u[2], 1); 
} 

et la fonction reduce:

function(key, val) { 
    var sum = 0; 
    for(var i in val) sum += val[i]; 
    return sum; 
} 

et appelez MapReduce: res = db.logs.mapReduce(m, r, {query: {type:"DOMcheck", category: /bad/i}})

Mais j'ai une erreur:

uncaught exception: map reduce failed: { 
"assertion" : "map invoke failed: JS Error: TypeError: u has no properties nofile_b:3", 
"assertionCode" : 9014, 
"errmsg" : "db assertion failure", 
"ok" : 0 
} 

Quel est le problème avec map fonctionne ici? Si i emit(this.url, 1) carte fonctionne très bien ...

Répondre

1

On dirait que votre regex ne correspond pas à l'URL. C'est pourquoi vous n'avez aucune propriété.

+0

Ce sont des allumettes. Si vous appelez simplement la fonction avec le paramètre, il renvoie le 3ème élément. Et je vérifie regex dans la console mongo - ça marche aussi. – NilColor

+0

Euh! Je suis désolé. Il y a une URL cassée qui ne correspond pas au modèle ... Merci pour l'idée;) – NilColor

0

Vous pouvez définir un pourcentage d'enregistrement non valide pour ignorer la quantité d'enregistrement non valide qui échoue. Et vous pouvez ajouter un compteur pour un enregistrement invalide.

+0

Ils ne sont pas invalides. Ils ont un port dans l'url. Comme ceci 'url: 'http: //s1.app.int: 4000/part/module/doc/2''. Donc je règle juste regexp et tout va bien maintenant. Merci pour votre réponse. – NilColor

+0

Comment allez-vous ajouter ce saut? – NightWolf

Questions connexes