sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB välj antal (distinkt x) på en indexerad kolumn - räkna unika resultat för stora datamängder

1) Det enklaste sättet att göra detta är via aggregeringsramverket. Detta kräver två "$group"-kommandon:det första grupperar efter distinkta värden, det andra räknar alla distinkta värden

pipeline = [ 
    { $group: { _id: "$myIndexedNonUniqueField"}  },
    { $group: { _id: 1, count: { $sum: 1 } } }
];

//
// Run the aggregation command
//
R = db.runCommand( 
    {
    "aggregate": "myCollection" , 
    "pipeline": pipeline
    }
);
printjson(R);

2) Om du vill göra detta med Map/Reduce kan du. Detta är också en tvåfasprocess:i den första fasen bygger vi en ny samling med en lista över alla distinkta värden för nyckeln. I den andra gör vi en count() på den nya samlingen.

var SOURCE = db.myCollection;
var DEST = db.distinct
DEST.drop();


map = function() {
  emit( this.myIndexedNonUniqueField , {count: 1});
}

reduce = function(key, values) {
  var count = 0;

  values.forEach(function(v) {
    count += v['count'];        // count each distinct value for lagniappe
  });

  return {count: count};
};

//
// run map/reduce
//
res = SOURCE.mapReduce( map, reduce, 
    { out: 'distinct', 
     verbose: true
    }
    );

print( "distinct count= " + res.counts.output );
print( "distinct count=", DEST.count() );

Observera att du inte kan returnera resultatet av kartan/förminska inline, eftersom det potentiellt kommer att överskrida gränsen på 16 MB dokumentstorlek. Du kan spara beräkningen i en samling och räkna sedan () storleken på samlingen, eller så kan du få antalet resultat från returvärdet för mapReduce().



  1. Referera till andra dokument med sträng snarare än ObjectId

  2. Hur får man junit-testerna att använda den inbäddade mongoDB i en springboot-applikation?

  3. Hur man säkrar MongoDB med användarnamn och lösenord

  4. Tar summan av kolumn i MongoDB