Meteor: cómo buscar solo valores de campo distintos, también conocidos como collection.distinct("nombre de campo") similar a Mongo''s
(4)
Mejorando la respuesta de richsilv:
function distinct(collection, field) {
return _.uniq(collection.find({}, {
sort: {[field]: 1}, fields: {[field]: 1}
}).fetch().map(x => x[field]), true);
}
Cómo utilizar:
var arrResults = distinct(MyCollection, ''myfield'');
Estoy usando Meteor, y estoy tratando de encontrar solo valores distintos (únicos) de un campo. Mongodb tiene el comando
Collection.distinct("fieldname");
pero no está implementado en el controlador Meteor para Mongo. Intenté usar el paquete meteor-mongo-extensions, pero obtuve un "indefinido" en la consola del cliente para un Collection.distinct("fieldname");
del lado del cliente Collection.distinct("fieldname");
¿Qué, esencialmente, es una búsqueda distinta?
Siento que alguien es una consulta tan básica, como por ejemplo una lista de estudiantes con su profesor como campo, y luego hacer una lista de estudiantes por profesores, por ejemplo ...
si puedo simplemente envolver mi cerebro perezoso errante en torno al concepto general, probablemente pueda bash algo viable.
Puedes usar underscore.js, que viene con Meteor, debería estar bien para el caso de uso sugerido. Es posible que tenga problemas de rendimiento si prueba esto en un gran conjunto de datos o lo ejecuta de forma repetida, pero debería ser adecuado para el uso común o en el jardín:
var distinctEntries = _.uniq(Collection.find({}, {
sort: {myField: 1}, fields: {myField: true}
}).fetch().map(function(x) {
return x.myField;
}), true);
Eso devolverá las distintas entradas en myField
para todos los documentos en la Collection
. Disculpas si el one-liner parece un poco difícil de manejar; las opciones de sort
y fields
y la bandera true
son solo para hacerlo más eficiente.
Si prefiere hacer esto en el servidor y así ahorrar memoria y ancho de banda del cliente, intente con este paquete agregador. Cubre la función "distinta" de mongodb. https://github.com/zvictor/meteor-mongo-server/
Una solución de mongo pura sin subrayado sería acceder directamente a la colección sin formato. Esto implica una Promesa (aunque puede usar await
para esperar el valor resuelto).
Collection._collection.rawCollection().distinct(''fieldname'').then(distinctValues => console.log(distinctValues))