【问题标题】:node.js mongodb driver and mongoose: multiple limits possible?node.js mongodb 驱动程序和猫鼬:可能有多个限制?
【发布时间】:2015-06-13 18:12:52
【问题描述】:

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

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

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

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

对于 mongoose 和本机 mongodb 驱动程序都是如此。

这可能吗?而且..有什么意义吗?

(我通常希望每个查询返回的文档数量

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

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

返回(据我所见)太多书(超过 1 本书),而且这本书的 weightedRating 很高,就像任何随机书都不会有(这应该通过第一个限制 (1) 实现) .

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

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

    没有。如果你这样做了

    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 }
    ])
    

    这将根据sort 仅对querylimit 结果进行排序。它不会返回由顺序sort 确定的第一个limit 结果匹配查询;它返回与query 匹配的limit 文档,按sort 排序,但不保证这些匹配文档如何适合与sort 匹配的所有结果的整体顺序。这将使用query 的索引(如果可用),并且如果limit 相对较小(例如

    如果有人以某种方式选择了所有文档,我想防止糟糕的响应时间,这种情况下不准确的结果是可以的

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

    【讨论】:

    • 匹配有点昂贵,因为我对文本进行正则表达式匹配。它已编入索引,但仍需要搜索所有内容。这就是为什么我想限制在此步骤中考虑的文档数量。第二个限制将是调用者实际想要的。你的回答对我帮助很大。我只是不明白指数的好处。对于数字匹配,它们加快了很多,对于文本上的正则表达式可能只有一点点?!
    猜你喜欢
    • 2013-12-03
    • 2015-01-30
    • 2012-08-12
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 2013-12-30
    • 1970-01-01
    相关资源
    最近更新 更多