Meteor: comment rechercher seulement des valeurs de champ distinctes alias une collection.distinct ("fieldname") similaire à celui de Mongo

J'utilise Meteor, et j'essaye de trouver seulement des valeurs (uniques) distinctes d'un champ. Mongodb a la commande

Collection.distinct("fieldname");

mais il n'est pas implémenté dans le pilote de météore pour Mongo. J'ai essayé d'utiliser le paquet meteor-mongo-extensions mais j'ai toujours un "non défini" sur la console client pour un côté client Collection.distinct("fieldname");

ce qui, essentiellement, d'une recherche?

j'ai l'impression que quelqu'un c'est une requête de base - comme par exemple une liste d'étudiants avec leur enseignant comme un champ, et ensuite faire une liste des élèves par les enseignants, par exemple...

si je peux juste envelopper mon cerveau paresseux errant autour du concept général je peux probablement bash quelque chose de réalisable.

23
demandé sur Vini.g.fer 2014-04-24 00:37:10

4 réponses

vous pouvez simplement utiliser le soulignement.js, qui vient avec Meteor - devrait être très bien pour le cas d'utilisation suggéré. Vous pourriez rencontrer des problèmes de performance si vous essayez cela sur un ensemble de données vaste ou l'exécutez à plusieurs reprises, mais il devrait être adéquat pour l'usage commun-ou-jardin:

var distinctEntries = _.uniq(Collection.find({}, {
    sort: {myField: 1}, fields: {myField: true}
}).fetch().map(function(x) {
    return x.myField;
}), true);

qui retournera les entrées distinctes dans myField pour tous les documents Collection. Toutes mes excuses si la doublure a l'air un peu lourde; la sort et fields et true drapeau sont juste pour le faire plus efficace.

25
répondu richsilv 2014-04-23 21:43:06

si vous préférez le faire sur le serveur et ainsi enregistrer la mémoire client et la bande passante essayer ce paquet d'agrégateur. Il enveloppe la fonction "distincte" de mongodb. https://github.com/zvictor/meteor-mongo-server/

8
répondu pelón 2014-04-24 21:29:46

améliorer la réponse de richsilv:

function distinct(collection, field) {
  return _.uniq(collection.find({}, {
    sort: {[field]: 1}, fields: {[field]: 1}
  }).fetch().map(x => x[field]), true);
}

utilisation:

var arrResults = distinct(MyCollection, 'myfield');
3
répondu Adriano P 2017-03-23 19:58:01

une solution de mongo pur et non souligné serait d'accéder directement à la collection brute. Cela implique une Promesse (bien que vous pouvez utiliser await attendre la valeur résolue).

Collection._collection.rawCollection().distinct('fieldname').then(distinctValues => console.log(distinctValues))

2
répondu hwrod 2017-06-27 23:56:51