1) Cách dễ nhất để làm điều này là thông qua khung tổng hợp. Điều này sử dụng hai lệnh "$ group":lệnh đầu tiên nhóm theo các giá trị riêng biệt, lệnh thứ hai đếm tất cả các giá trị riêng biệt
pipeline = [
{ $group: { _id: "$myIndexedNonUniqueField"} },
{ $group: { _id: 1, count: { $sum: 1 } } }
];
//
// Run the aggregation command
//
R = db.runCommand(
{
"aggregate": "myCollection" ,
"pipeline": pipeline
}
);
printjson(R);
2) Nếu bạn muốn làm điều này với Bản đồ / Thu nhỏ, bạn có thể. Đây cũng là một quá trình gồm hai giai đoạn:trong giai đoạn đầu, chúng tôi xây dựng một bộ sưu tập mới với danh sách mọi giá trị riêng biệt cho khóa. Trong lần thứ hai, chúng tôi thực hiện đếm () trên bộ sưu tập mới.
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() );
Lưu ý rằng bạn không thể trả về kết quả của bản đồ / thu nhỏ nội tuyến, vì điều đó có thể sẽ vượt quá giới hạn kích thước tài liệu 16MB. Bạn có thể lưu phép tính trong một tập hợp và sau đó đếm () kích thước của tập hợp hoặc bạn có thể nhận số lượng kết quả từ giá trị trả về của mapReduce ().