6

Qui sotto mostra il mio codice. Devo calcolare quante volte si è ripetuto il valore distinto. Qui ho un valore distinto in "risultati". Ho usato collection.count() per calcolare ma non funziona. per favore qualcuno mi dica dove devo sbagliare. Grazie mille .MongoDB conta un valore distinto?

var DistinctIntoSingleDB = function(Collection,arr,opt,distVal,callback){ 
Collection.find({}).distinct(distVal, function(err, results) { 
     if(!err && results){ 
      console.log("Distinct Row Length :", results.length); 
      var a,arr1 = []; 
      for(var j=0; j<results.length; j++){ 
       collection.count({'V6': results[j]}, function(err, count) { 
         console.log(count) 
       }); 

       arr1.push(results[j]+ " : " +a); 
      } 
      callback(results,arr1); 
     }else{ 
      console.log(err, results); 
      callback(results); 
     } 
}); 

risposta

0

Per ottenere le occorrenze di valori distinti di un campo 'field1' su una collezione 'col1' e scrivere in una collezione 'DistinctCount' separata. Consentire inoltre di utilizzare lo spazio su disco nel caso in cui la raccolta sia enorme.

db.col1.aggregate(
      [{$group: { 
       _id: "$field1", 
       count: { $sum : 1 } 
      }}, { 
      $group: { 
       _id: "$_id", 
       count: { $sum : "$count" } 
      }},{ 
       $out: "distinctCount" 
      }], 
     {allowDiskUse:true} 
) 
+0

Il secondo '$ group' non è in realtà facendo nulla qui dal momento che è solo utilizzando lo stesso valore di' _id', così come passare attraverso lo stesso valore di uscita a '$ sum'. Anche '$ out' è stato introdotto nella stessa versione in cui l'output predefinito' .aggregate() 'è in realtà un" cursore ", quindi i problemi precedenti con un risultato in un singolo documento BSON non sono più un problema qui. Altre API oltre alla shell potrebbero essere "predefinite" per un documento BSON, ma possono essere facilmente modificate per restituire un "cursore". Devi solo usare '$ out' dove effettivamente" intendi "creare una nuova collezione per i risultati. –

8

Mentre .distinct() funziona bene per solo ottenere i valori distinti per un campo, al fine di ottenere effettivamente i conteggi di eventi, questo è più adatta alla aggregation framework:

Collection.aggregate([ 
    { "$group": { 
     "_id": "$field", 
     "count": { "$sum": 1 } 
    }} 
],function(err,result) { 

}); 

Anche la Il metodo .distinct() fa "abstract" da dove il campo "distinto" specificato è effettivamente all'interno di un array. In questo caso è necessario chiamare $unwind prima di elaborare gli elementi della matrice qui:

Collection.aggregate([ 
    { "$unwind": "$array" }, 
    { "$group": { 
     "_id": "$array.field", 
     "count": { "$sum": 1 } 
    }} 
],function(err,result) { 

}); 

Così il lavoro principale è fondamentalmente fatto in $group da "raggruppamento" sui valori dei campi, il che significa la stessa cosa di "distinta ". Il $sum è un operatore di raggruppamento che in questo caso aggiunge solo 1 per ogni occorrenza di quel valore nel campo per quella raccolta.