如何在猫鼬中查询不同的值?


70

我有一个问题,我希望能够获得一个集合的所有唯一城市,而我的代码如下所示:

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

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

在本地的MongoDb中,我可以做到db.person.distinct("born_in_city"),但是似乎没有与Mongoose等效的东西。是我自己遍历所有文档的唯一选择,还是有更好的解决方案?

为了尝试使用node-mongodb-native应答者建议的基础,我尝试这样做:

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

但是,该results字段为空,没有错误。我还希望能够仅按名称获取所需的集合,而不是collections尽可能地过滤返回的内容。

Answers:


130

只是为了给Mongoose 3.x更新:

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

36
您也可以直接在Model上调用它。 MyModel.distinct('_id', { foo: 'bar' }, function(error, ids)...
JohnnyHK

2
然后如何按ID排序结果?
2013年

4
从猫鼬文档(mongoosejs.com/docs/api.html#query_Query-sort)中的示例中,我认为您可以编写:MyModel.find({ sort: { '_id': -1 }}).distinct('_id', function(error, ids){/* handle result */});
Risadinha 2013年

@Risadinha:它显示:“排序不能与不同的
字符

然后,要对生成的ID数组进行排序,只需使用javascript Array.prototype.sort():MyModel.distinct('_id', function(error, ids) { ids.sort(); ... })
Aymeric Bouzy aybbyk

21

在我的程序中,此代码有效。

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

通过node.js v0.4.7,猫鼬1.3.3


2

我通读了源代码,并由node-mongodb-native驱动程序驱动了该类。所以在连接对象上。因此,在完成mongoose.connect(mongodb://)之后,您可以尝试一下。

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

  });
}

谢谢你的建议。mongoose.connections[0].conn对于我来说是不确定的,但是我很确定mongoose.connection对于活动连接返回相同的内容。尽管我不能按照mongoose.connection.person您的建议使用mongoose.connection.db.collections( .. ),但是我打电话给,但是一旦运行collection.distinct( .. ),结果就为空。我更新了问题以反映到目前为止的尝试。
Kit Sunde
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.