sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB vælg count (distinct x) på en indekseret kolonne - tæl unikke resultater for store datasæt

1) Den nemmeste måde at gøre dette på er via aggregeringsrammen. Dette kræver to "$group"-kommandoer:den første grupperer efter distinkte værdier, den anden tæller alle de distinkte værdier

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

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

2) Hvis du vil gøre dette med Kort/Reducer, kan du. Dette er også en to-faset proces:I den første fase bygger vi en ny samling med en liste over hver enkelt værdi for nøglen. I den anden laver vi en count() på den nye samling.

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() );

Bemærk, at du ikke kan returnere resultatet af kortet/reducere inline, fordi det potentielt vil overskride grænsen på 16 MB dokumentstørrelse. Du kan gem beregningen i en samling og tæl derefter () størrelsen af ​​samlingen, eller du kan få antallet af resultater fra returværdien af ​​mapReduce().



  1. Visuel styring af MongoDB-dokumenter og samlinger

  2. Er det muligt at generere dynamisk navngivne MongoDB-samlinger?

  3. MongoDB Regular Expression Search - Starter med at bruge javascript-driver og NodeJS

  4. 'Det lykkedes ikke at fjerne linket til socketfilen i MongoDB 3.0