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.
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.
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/
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');
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))