2011-05-18 31 views
43

Tengo un problema en el que yo quiero ser capaz de obtener todas las ciudades únicas para una colección, y mi código es como la siguiente:¿Cómo consulto distintos valores en Mongoose?

var mongoose = require("mongoose"), 
Schema = mongoose.Schema; 

var PersonSchema = new Schema({ 
    name: String, 
    born_in_city: String 
}); 
var Person = mongoose.model('Person', PersonSchema); 

En MongoDB nativa tan sólo pudiera hacer db.person.distinct("born_in_city"), pero doesn' Parece ser algo equivalente para Mongoose. ¿Es la única opción para iterar sobre todos los documentos para hacer esto, o hay una mejor solución?

En un intento de utilizar la node-mongodb-native subyacente según lo sugerido por el contestador me trataron de hacer esto:

mongoose.connection.db.collections(function(err, collections){ 
    collections[0].distinct('born_in_city', function(err, results){ 
    console.log(err, results); 
    }); 
}); 

Sin embargo, el results está vacío y no hay error. También preferiría poder buscar solo la colección necesaria por nombre en lugar de tener que filtrar lo que collections devolver si es posible.

Respuesta

80

Sólo para dar una actualización para 3.x Mangosta:

MyModel.find().distinct('_id', function(error, ids) { 
    // ids is an array of all ObjectIds 
}); 
+23

También puede llamarlo directamente en [Modelo] (http://mongoosejs.com/docs/api.html#model_Model-distinct). 'MyModel.distinct ('_ id', {ejem: 'bar'}!, La función (error, IDS) ...' – JohnnyHK

+0

impresionante, gracias – diosney

+0

¿Cómo se puede entonces ordenar el resultado por identificadores de – Melki

2

Leo a través del código fuente y el controlador node-mongodb-native es lo que impulsa la clase. Entonces en el objeto de conexión. Entonces, después de haber hecho mongoose.connect (mongodb: //), puede darle una oportunidad.

if(mongoose.connections.length > 0) { 
    var nativeconn = mongoose.connections[0].conn; 
    nativeconn.person.distinct('born_in_city', function(error, results){ 

    }); 
} 
+0

Gracias por la sugerencia. 'mongoose.connections [0] .conn' no está definido para mí, sin embargo estoy bastante seguro de que' mongoose.connection' devuelve lo mismo para la conexión activa. Aunque no puedo usar 'mongoose.connection.person' como sugirió, en su lugar hice una llamada a' mongoose.connection.db.collections (..) ', pero una vez que ejecuté' collection.distinct (..) ' los resultados fueron vacíos Actualicé mi pregunta para reflejar mis intentos hasta ahora. –

13

En mi programa, este código funciona.

Person.collection.distinct("born_in_city", function(error, results){ 
    console.log(results); 
}); 

por Node.js v0.4.7, mangosta 1.3.3

+0

Eso funciona genial, gracias! :) –

Cuestiones relacionadas