2015-08-10 5 views
2

Je suis nouveau à MongoDB, et jusqu'à présent, il semble qu'il essaie de faire de son mieux pour rendre les choses simples trop complexes.valeur distincte avec le compte et la condition mongo DB

Je suis en train d'exécuter le dessous MYSQL équivalent

SELECT userid, COUNT(*) 
FROM userinfo 
WHERE userdata like '%PC% or userdata like '%wire%' 
GROUP BY userid 

Je mongo la version 3.0.4 et je suis en cours d'exécution MongoChef. Je essayé d'utiliser quelque chose comme ci-dessous:

db.userinfo.group({ 
"key": { 
    "userid": true 
}, 
"initial": { 
    "countstar": 0 
}, 
"reduce": function(obj, prev) { 
prev.countstar++; 
}, 
"cond": { 
    "$or": [{ 
     "userdata": /PC/ 
    }, { 
     "userdata": /wire/ 
    }] 
} 
}); 

mais cela n'a pas aimé l'OR. quand j'ai sorti l'OR, pensant que je ferais la moitié à la fois et combiner les résultats en Excel, j'ai une erreur "groupe() ne peut pas gérer plus de 20000 clés uniques", et la table de résultat devrait être beaucoup plus grande que ça. D'après ce que je peux dire en ligne, je pourrais le faire en utilisant des pipelines d'agrégation, mais je ne trouve pas d'exemples clairs sur la façon de le faire. Cela semble être une chose simple qui devrait être intégrée à n'importe quelle base de données, et cela n'a aucun sens de ne pas l'être. Toute aide est très appréciée.

Répondre

3

/

Works « sooo » beaucoup mieux avec la méthode .aggregate(), comme .group() est un moyen très surannée d'aborder ceci:

db.userinfo.aggregate([ 
    { "$match": { 
     "userdata": { "$in":[/PC/,/wire/] } 
    }}, 
    { "$group": { 
     "_id": "$userid", 
     "count": { "$sum": 1 } 
    }} 
]) 

Le $in est une manière beaucoup plus court ici d'écrire votre $or condition aussi bien.

Il s'agit d'un code natif, contrairement à la traduction JavaScript, qui s'exécute beaucoup plus rapidement.