【问题标题】:Get all the entries between two other entries in MongoDB获取 MongoDB 中其他两个条目之间的所有条目
【发布时间】:2012-02-03 16:24:21
【问题描述】:

我有一个包含对象的 MongoDB 集合,其 _id 属性是一个字符串。

我想对该集合执行 .find() 操作,对返回的游标执行 .sort() 。然后, .toArray() 的操作会给我一个特定顺序的文档数组。但是,我不想提取所有这些文档,而只想提取其中两个之间的文档。

现在,我知道我可以执行 .toArray(),将我的所有结果放在一个数组中,然后选择两个文档之间的间隔,但这会花费太多资源。 如果可能,我希望在执行 .toArray() 之前选择该间隔,或者通常以最节省资源的方式。

我想要完成的是 .limit() 和 .skip() (分页)的替代方案,但通过提供“开始”和“结束”文档的 _id 来精确定位间隔。

例如鉴于.find().sort({_id: 1}).toArray() 给出:

{_id: "a", a: "First entry"},
{_id: "bar", a: "Third entry"},
{_id: "bar2", a: "Fourth entry"},
{_id: "bar3", a: "Fifth entry"},
{_id: "bar4", a: "Sixth entry"},
{_id: "foo", a: "SEcond entry"}

我需要类似的东西 find().sort({_id: 1}).allAfter({_id: "bar"}).allBefore({_id: "bar4"}).toArray(...); 给我:

{_id: "bar2", a: "Fourth entry"},
{_id: "bar3", a: "Fifth entry"},

【问题讨论】:

  • 这没什么意义,因为 before 和 after 意味着一个预期的顺序(或排序)。如果您想排序一次以找到两个值之间的文档,那么您必须在客户端中排序以将它们以另一个顺序返回给用户。
  • 不,我想按相同的顺序返回给客户端。而且我不想选择“两个值之间的文档”,而是选择其他两个文档之间的文档。
  • 请提供文件示例和您想要退回的文件,以及如何退回。如果没有排序/顺序,您的“其他两个文件之间的描述”是没有意义的;也许你的意思是广告订单...
  • 我重写了这个问题,希望现在更干净。

标签: javascript node.js mongodb pagination


【解决方案1】:

似乎您在暗示插入顺序:“bar”插入在“a”之前,“foo”插入在“bar2”之后。

您不能在 mongodb 中按插入顺序进行查询(可能是因为 mongo 有时会重新排序集合中的文档,例如,如果您对“bar2”进行更新并且没有足够的分配空间,那么 mongo 可以将其物理放在后面“酒吧 4")。

如果您可以生成整数/长 ID,或者通过添加插入时间/日期字段,您的问题将很容易解决。

【讨论】:

  • 这无关紧要。在我已经有了光标并在其上应用了 .sort() 之后,我需要在两个结果之间进行选择。 $lt 和 $gt 不起作用,因为我有时可能有不同的排序顺序(我传递给 .sort() 的内容是未知的)。
  • 啊哈,我当时不明白你的问题。您需要在搜索中搜索。这是单个搜索“会话”的一部分,还是您先搜索和排序,让用户选择结果子集,然后再次搜索?
  • 搜索、排序(像通常的 MongoDB 查询一样)然后选择这些结果的子集。如果您想到更容易理解的解释,请编辑我的帖子。
  • 我不明白那你为什么不把它作为查询的一部分,这个子集的选择。
  • 因为,假设我有 30000 个结果从查询返回并加载到内存中。除了这是一项繁重的操作之外,我还必须通过遍历所有记录来使其更加繁重,以便选择其中的一个子集(一个之后,另一个之前)。
【解决方案2】:

您所说的是基于范围的分页(范围在排序上)。您可以通过跟踪前一页和下一页的边缘轻松地做到这一点。以下是一些现有的答案:

Range based paging mongodb

How to do pagination using range queries in MongoDB?

http://groups.google.com/group/mongodb-user/browse_thread/thread/dc46592112735bf0/a5c700b1283537d8

如果这不足以满足您的需求,请告诉我。

【讨论】:

  • 我猜是的。这样做的问题是 ID 是字符串,这意味着,如果我要使用范围查询,我必须始终按字母顺序排序。如果我想按另一个键排序,因为我只有“开始于”和“结束于”元素的 ID,我必须首先查询它们并找到该键的值,以便我可以将它们传递给$lt 和 $gt。但它有效。
  • 但是,如果您对 id 进行排序,那么无论您是否喜欢、知道或不知道,您都是按字母数字排序的。这将是一致的,这是基于范围的分页的主要目标。
猜你喜欢
  • 2017-08-09
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
  • 2018-01-13
  • 2023-04-10
  • 1970-01-01
相关资源
最近更新 更多