Reputation: 37075
I have a problem where I want to be able to get all the unique cities for a collection, and my code looks something like this:
var mongoose = require("mongoose"),
Schema = mongoose.Schema;
var PersonSchema = new Schema({
name: String,
born_in_city: String
});
var Person = mongoose.model('Person', PersonSchema);
In native MongoDb I could just do db.person.distinct("born_in_city")
, but there doesn't seem to be anything equivalent for Mongoose. Is the only option to iterate over all of the documents myself to do this, or is there a better solution?
In an attempt to use the underlying node-mongodb-native
as suggested by the answerer I attempted to do this:
mongoose.connection.db.collections(function(err, collections){
collections[0].distinct('born_in_city', function( err, results ){
console.log( err, results );
});
});
However the results
is empty and there's no error. I would also prefer to be able to fetch only the needed collection by name rather than have to filter what collections
return if at all possible.
Upvotes: 90
Views: 136943
Reputation: 101
const findBornCity = async() => {
const bornCity = await Person.find().distinct("born_in_city")
return bornCity
}
Upvotes: 3
Reputation: 16666
Just to give an update for Mongoose 3.x:
MyModel.find().distinct('_id', function(error, ids) {
// ids is an array of all ObjectIds
});
Upvotes: 166
Reputation: 241
In my program, this code works.
Person.collection.distinct("born_in_city", function(error, results){
console.log(results);
});
by node.js v0.4.7, mongoose 1.3.3
Upvotes: 24
Reputation: 717
I read through the source code and the node-mongodb-native driver is what powers the class. So on the connection object. So after you have done mongoose.connect(mongodb://), you can give this a shot.
if(mongoose.connections.length > 0) {
var nativeconn = mongoose.connections[0].conn;
nativeconn.person.distinct('born_in_city', function(error, results){
});
}
Upvotes: 2