Reputation: 443
I'm using Meteor, and I'm trying to find only distinct (unique) values of a field. Mongodb has the command
Collection.distinct("fieldname");
but it's not implemented in the Meteor driver for Mongo.
I've tried using the meteor-mongo-extensions package but still got an "undefined" on the client console for a client-side Collection.distinct("fieldname");
what, essentially, is a distinct looking for?
I feel like someone this is such a basic query- like for example a list of students with their teacher as a field, and then making a list of students by teachers out of that, for example...
if I can just wrap my lazy errant brain around the general concept I can probably bash something workable out.
Upvotes: 25
Views: 15535
Reputation: 469
A Non-Underscore, pure mongo solution would be to access the raw collection directly. This involves a Promise (though you can use await
to await the resolved value).
Note: it will run on the MongoDB server and return distinct values to the client.
Collection._collection.rawCollection().distinct('fieldname').then(distinctValues => console.log(distinctValues))
Upvotes: 8
Reputation: 2135
Improving richsilv's answer:
function distinct(collection, field) {
return _.uniq(collection.find({}, {
sort: {[field]: 1}, fields: {[field]: 1}
}).fetch().map(x => x[field]), true);
}
How to use:
var arrResults = distinct(MyCollection, 'myfield');
Upvotes: 6
Reputation: 413
If you'd prefer to do this on the server and thus save client memory and bandwidth try this aggregator package. It wraps mongodb's "distinct" function. https://github.com/zvictor/meteor-mongo-server/
Upvotes: 9
Reputation: 8013
You can just use underscore.js, which comes with Meteor - should be fine for the suggested use case. You might run into performance problems if you try this on a vast data set or run it repeatedly, but it should be adequate for common-or-garden usage:
var distinctEntries = _.uniq(Collection.find({}, {
sort: {myField: 1}, fields: {myField: true}
}).fetch().map(function(x) {
return x.myField;
}), true);
That will return the distinct entries in myField
for all documents in Collection
. Apologies if the one-liner looks a bit unwieldy; the sort
and fields
options and the true
flag are just to make it more efficient.
Upvotes: 29