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 }
])
这将根据 sort
对 query
的 limit
个结果进行排序。它不会return第limit
个结果匹配查询按顺序sort
确定;它 return 是匹配 query
的 limit
文档,按 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 个?如果查询和排序没有被索引,问题实际上不在于查询选择了多少文档——而是必须检查许多文档以找出哪些匹配并将它们按正确的顺序排列。
我可以多次限制查找结果的数量吗?
原因是我现在要为现有应用程序的结果添加一个排序选项。我已经限制了分页的结果集,但是如果我另外排序,首先必须对整个结果进行排序,然后对结果 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 }
])
这将根据 sort
对 query
的 limit
个结果进行排序。它不会return第limit
个结果匹配查询按顺序sort
确定;它 return 是匹配 query
的 limit
文档,按 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 个?如果查询和排序没有被索引,问题实际上不在于查询选择了多少文档——而是必须检查许多文档以找出哪些匹配并将它们按正确的顺序排列。