Javascript mongodb.find().sort().limit(1).toArray()所用的时间与不使用.limit(1)所用的时间一样长

Javascript mongodb.find().sort().limit(1).toArray()所用的时间与不使用.limit(1)所用的时间一样长,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我正在尝试解决我的应用程序中的一个性能问题,我有一个查询,它从mongo返回835个相当大的文档,并且调用.toArray方法几乎需要整整一秒钟 我真的只需要具有最高值的记录,所以我尝试执行sort()和.limit(),但是当我执行.toArray()时,.limit(1)的性能与没有.limit(1)的性能一样慢 这是怎么回事?我该如何回避这个问题 我注意到.nextObject()对.toArray()的性能也没有影响 var query = { "participation":{

我正在尝试解决我的应用程序中的一个性能问题,我有一个查询,它从mongo返回835个相当大的文档,并且调用.toArray方法几乎需要整整一秒钟

我真的只需要具有最高值的记录,所以我尝试执行sort()和.limit(),但是当我执行.toArray()时,.limit(1)的性能与没有.limit(1)的性能一样慢

这是怎么回事?我该如何回避这个问题

我注意到
.nextObject()
.toArray()
的性能也没有影响

var query = {
  "participation":{
    "$elemMatch":{
      "typeCode":"SBJ",
      "role.id":{
        "$elemMatch":{
          "root":"1.2.3.99.100",
          "extension":"123456"
        }
      }
    }
  },
  "code.code":{
    "$in":["first","second"]
  }
};


console.time('performance');
data = mongoCollection
    .find(query)
    .sort({'effectiveTime.value':-1});

data.toArray(function (err, result) {
  console.log(result.length) => 835
  console.timeEnd('performance'); => Around 900ms
VS

注意:读取产生相同结果的查询的更简单方法是:

var query {
        'participation.typeCode':'SBJ',
        'participation.role.id.root': '1.2.3.99.100', 
        'participation.role.id.extension': '123456'
    };
注意:查询本身在mongo GUI客户机中运行得很快,没有启用排序功能,但使用排序功能时,查询本身几乎需要整整一秒钟的时间


除了排序之外,还有更好的方法获得集合中属性的最高值吗

如果排序无法利用索引,则需要将所有文档读入内存,而不管
限制(1)
。您有支持查询和排序组合的索引吗?我在“effectiveTime.value”中添加了一个索引,但它似乎对性能没有任何影响。排序可能无法使用该索引,因为您的查询和排序组合必须能够利用同一个索引。你能用你的
查询
对象更新你的问题吗?如果排序不能利用索引,那么不管
限制(1)
,所有文档都需要读入内存。您有支持查询和排序组合的索引吗?我在“effectiveTime.value”中添加了一个索引,但它似乎对性能没有任何影响。排序可能无法使用该索引,因为您的查询和排序组合必须能够利用同一个索引。你能用你的
查询
对象更新你的问题吗?
var query {
        'participation.typeCode':'SBJ',
        'participation.role.id.root': '1.2.3.99.100', 
        'participation.role.id.extension': '123456'
    };