【问题标题】:How do I query for distinct values in Mongoose?如何在 Mongoose 中查询不同的值?
【发布时间】:2011-08-27 23:33:48
【问题描述】:

我有一个问题,我希望能够为一个集合获取所有独特的城市,我的代码如下所示:

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 返回的内容。

【问题讨论】:

    标签: mongodb node.js mongoose


    【解决方案1】:
    const findBornCity = async() => {
        const bornCity = await Person.find().distinct("born_in_city")
        return bornCity
    }
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案2】:

    只是为 Mongoose 3.x 提供更新:

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

    【讨论】:

    • 也可以直接在Model上调用。 MyModel.distinct('_id', { foo: 'bar' }, function(error, ids)...
    • 我怎样才能按 ids 排序结果?
    • 从 Mongoose Docs (mongoosejs.com/docs/api.html#query_Query-sort) 中的示例,我认为您可以写:MyModel.find({ sort: { '_id': -1 }}).distinct('_id', function(error, ids){/* handle result */});
    • @Risadinha:它显示:“sort cannot be used with distinct”
    • 然后对生成的 id 数组进行排序,只需使用 javascript Array.prototype.sort() :MyModel.distinct('_id', function(error, ids) { ids.sort(); ... })
    【解决方案3】:

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

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

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

    【讨论】:

    • 我也想使用限制。但这不允许
    【解决方案4】:

    我通读了源代码,并且 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( .. ),结果是空的。我更新了我的问题以反映我迄今为止的尝试。
    猜你喜欢
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 2017-06-21
    • 2017-07-21
    • 2020-08-30
    相关资源
    最近更新 更多