node.js mongodb driver 和 mongoose:可能有多个限制?

node.js mongodb driver and mongoose: multiple limits possible?

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

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

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

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

而且 mongoose 和本机 mongodb 驱动程序。

这可能吗?还有..这有什么意义吗?

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

实际上,通过快速测试,我无法在 mongo 命令行中提出 javascript 查询 - 尽管我认为聚合框架应该是可能的..

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

returns(据我所知)书太多(超过 1 本),而且这本书的加权评分很高,就像任何随机书都没有的那样(这应该由第一个限制(1)).

Can I limit the amount of find-results several times?

没有。如果你这样做

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

那么您使用 .limit 所做的就是将限制设置为 10。

if I additionally sort, first the whole result would have to be sorted and then the result skipped/limited

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

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

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

很难理解您要查找的内容,但听起来您只想对查询 return 的第一个 N 结果进行排序,而不是 returning 给定排序查询的前 N 个结果。可以使用聚合框架:

db.test.aggregate([
    { "$match" : query },
    { "$limit" : limit },
    { "$sort" : sort }
])

这将根据 sortquerylimit 个结果进行排序。它不会return第limit个结果匹配查询按顺序sort确定;它 return 是匹配 querylimit 文档,按 sort 排序,无法保证这些匹配文档如何符合所有匹配结果的总体顺序 sort.如果可用,这将为 query 使用索引,如果 limit 相对较小(比如 < 100),则排序不会很昂贵。

if someone somehow selects all documents, I want to prevent bad response time, and inaccurate results are ok for that case

如果您担心 return 结果太多,为什么不设置一个默认限制,比如 100 个?如果查询和排序没有被索引,问题实际上不在于查询选择了多少文档——而是必须检查许多文档以找出哪些匹配并将它们按正确的顺序排列。