2016-07-15 1 views
0

Je collecte des données suivantes (Collection contient plus de 10 millions de disques)MongoDB question Distinct Count

> db.LogBuff.find() 
{ "_id" : ObjectId("578899d5d2b76f77d083f16c"), "SUBJECT" : "DD", "SYS" : "A" } 
{ "_id" : ObjectId("578899d5d2b76f77d083f16d"), "SUBJECT" : "AA", "SYS" : "B" } 
{ "_id" : ObjectId("578899d5d2b76f77d083f16e"), "SUBJECT" : "BB", "SYS" : "A" } 
{ "_id" : ObjectId("578899d5d2b76f77d083f16f"), "SUBJECT" : "AA", "SYS" : "C" } 
{ "_id" : ObjectId("578899d5d2b76f77d083f170"), "SUBJECT" : "BB", "SYS" : "A" } 
{ "_id" : ObjectId("578899d5d2b76f77d083f171"), "SUBJECT" : "BB", "SYS" : "A" } 
{ "_id" : ObjectId("578899d5d2b76f77d083f172"), "SUBJECT" : "CC", "SYS" : "B" } 
{ "_id" : ObjectId("578899d5d2b76f77d083f173"), "SUBJECT" : "AA", "SYS" : "A" } 
{ "_id" : ObjectId("578899d5d2b76f77d083f174"), "SUBJECT" : "CC", "SYS" : "A" } 
{ "_id" : ObjectId("578899d5d2b76f77d083f175"), "SUBJECT" : "DD", "SYS" : "A" } 
{ "_id" : ObjectId("578899d5d2b76f77d083f176"), "SUBJECT" : "AA", "SYS" : "A" } 
{ "_id" : ObjectId("578899d5d2b76f77d083f177"), "SUBJECT" : "BB", "SYS" : "C" } 
{ "_id" : ObjectId("578899d5d2b76f77d083f178"), "SUBJECT" : "CC", "SYS" : "D" } 
{ "_id" : ObjectId("578899d5d2b76f77d083f179"), "SUBJECT" : "DD", "SYS" : "A" } 
{ "_id" : ObjectId("578899d5d2b76f77d083f17a"), "SUBJECT" : "AA", "SYS" : "B" } 
{ "_id" : ObjectId("578899d5d2b76f77d083f17b"), "SUBJECT" : "BB", "SYS" : "B" } 
{ "_id" : ObjectId("578899d5d2b76f77d083f17c"), "SUBJECT" : "AA", "SYS" : "A" } 
{ "_id" : ObjectId("578899d5d2b76f77d083f17d"), "SUBJECT" : "CC", "SYS" : "C" } 

Je veux obtenir le genre suivant de la production

{ "_id" : { "SUBJECT" : "CC", "SYS" : "C" }, "COUNT" : 1 } 
{ "_id" : { "SUBJECT" : "DD", "SYS" : "A" }, "COUNT" : 3 } 
{ "_id" : { "SUBJECT" : "AA", "SYS" : "B" }, "COUNT" : 2 } 
{ "_id" : { "SUBJECT" : "AA", "SYS" : "C" }, "COUNT" : 1 } 
{ "_id" : { "SUBJECT" : "CC", "SYS" : "B" }, "COUNT" : 1 } 
{ "_id" : { "SUBJECT" : "BB", "SYS" : "A" }, "COUNT" : 3 } 
{ "_id" : { "SUBJECT" : "BB", "SYS" : "C" }, "COUNT" : 1 } 
{ "_id" : { "SUBJECT" : "AA", "SYS" : "A" }, "COUNT" : 3 } 
{ "_id" : { "SUBJECT" : "CC", "SYS" : "A" }, "COUNT" : 1 } 
{ "_id" : { "SUBJECT" : "CC", "SYS" : "D" }, "COUNT" : 1 } 
{ "_id" : { "SUBJECT" : "BB", "SYS" : "B" }, "COUNT" : 1 } 

Ceci est mon code

db.LogBuff.mapReduce(  
    function(){   
     emit({ SUBJECT : this.SUBJECT, SYS : this.SYS } , this.SYS);  
    },  
    function(key,values){   
     return $count:1 <-stuck here 
    } 
) 

En raison de certaines limitations, je ne peux pas utiliser la méthode d'agrégation. J'ai utilisé le code d'agrégation suivant:

db.LogBuff.aggregate([ {"$group" : {_id:{SUBJECT:"$SUBJECT",SYS:"$SYS"},COUNT:{$sum:1}}}, {$sort:{_id:1}},]) 

Bien que cela fonctionne pour un nombre limité d'enregistrements, pour de grandes quantités, il renvoie cette erreur (note - Je ne suis pas l'utilisateur root, donc je ne peux pas changer la configuration) :

assert: commande a échoué: { "ok": 0, "errmsg": « limite de mémoire Trier dépassé de 104857600 octets, mais n'a pas opté pour le tri externe opération Aborting Passe allowDiskUse:.. fidèle à opter in. "," code ": 16819}:
l'agrégat a échoué [email protected]/mongo/shell/utils.js: 25: 13

+0

utilisant le framework d'agrégation Essayé? ou vous devez utiliser MapReduce seulement? –

+0

J'ai utilisé l'agrégation, mais cela fonctionne pour un nombre limité de recored, une grande quantité de retour après une erreur de memomry (je ne suis pas l'utilisateur root, je ne peux pas changer les configurations) – Kavinda

+0

assert: command failed: { "ok": 0 "Errmsg": "Le tri a dépassé la limite de mémoire de 104857600 octets, mais n'a pas opté pour le tri externe Opération d'abandon." Autoriser allowDiskUse: true pour activer. ", " code ": 16819 }: global failed _getErrorWithCode @ src/mongo/shell/utils.js: 25: 13 [email protected]/mongo/shell/assert.js: 13: 14 – Kavinda

Répondre

1

Essayez d'utiliser l'option allowDiskUse:

db.LogBuff.aggregate([ {"$group" : {_id:{SUBJECT:"$SUBJECT",SYS:"$SYS"},COUNT:{$sum:1}}}, {$sort:{_id:1}}], {allowDiskUse: true})
+0

merci, fonctionne bien – Kavinda