Meteor: how to search for only distinct field values aka a collection.distinct("fieldname") similar to Mongo's

StackOverflow https://stackoverflow.com/questions/23254699

  •  08-07-2023
  •  | 
  •  

Pregunta

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.

¿Fue útil?

Solución

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.

Otros consejos

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/

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

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');
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top