node.js mongodb驱动程序和猫鼬:可能有多个限制?

时间:2015-04-08 16:42:03

标签: node.js mongodb mongoose

我可以多次限制查找结果的数量吗?

原因是我现在正在为现有应用程序的结果添加一个排序选项。我已经限制了分页的结果集,但如果我另外排序,首先必须对整个结果进行排序,然后跳过/限制结果。

我不关心100%准确的结果,但不想让数据库太忙。所以我想要的是:

MyCollection.find(pattern).limit(somelargenumber).sort({score:desc}).skip(0).limit(10);

并且对于猫鼬和本地mongodb驱动程序都是。

这甚至可能吗?并且......它有意义吗?

(我通常希望每个查询返回的文档数量都小于100,但是如果有人以某种方式选择了所有文档,我想防止响应时间错误,并且对于那种情况,结果不准确。)

实际上,从快速测试来看,我无法在mongo命令行中提出javascript查询 - 尽管我认为应该可以使用聚合框架..

 db.books.find().limit(1).sort({weightedRating:-1}).limit(10);

返回(据我所知)太多的书(超过1本),而且这本书的加权率也很高,就像没有任何随机书一样(本应该通过第一个限制(1)实现)

1 个答案:

答案 0 :(得分:2)

  

我可以多次限制查找结果的数量吗?

没有。如果你这样做

db.test.find(query).limit(1).sort(sort).limit(10)

然后您使用.limit完成的所有操作都将限制设置为10.

  

如果我另外排序,首先必须对整个结果进行排序,然后跳过/限制结果

您的查询(包括排序)是否已编入索引?如果你有像

这样的查询
db.test.find({ "a" : 22 }).sort({ "b" : -1 })

{ "a" : 1, "b" : -1 }上的索引,然后MongoDB可以使用索引按排序顺序检索结果。索引可以免费排序。

很难理解您正在寻找的内容,但听起来您只想对查询返回的第一个N结果进行排序,而不是返回第一个N结果db.test.aggregate([ { "$match" : query }, { "$limit" : limit }, { "$sort" : sort } ]) 1}}给定排序的查询结果。可以使用聚合框架:

limit

这将根据querysort的{​​{1}}结果进行排序。它不会返回由订单limit确定的第一个sort结果匹配查询;它会返回limitquery排序的sort文档,但不保证这些匹配文档如何符合匹配sort的所有结果的整体顺序。这将使用query的索引(如果有),如果limit相对较小(例如<100),则排序不会很昂贵。

  

如果某人以某种方式选择了所有文件,我想防止错误的响应时间,并且该案例的结果不准确

如果您担心返回太多结果,为什么不只有100的默认限制?如果查询和排序没有被索引,则问题实际上并不是查询选择了多少文档 - 必须检查许多文档以找出哪些文档匹配并且把它们按正确的顺序排列。