Node.js MongoDB聚合以查找第一个值大于n的文档

Node.js MongoDB聚合以查找第一个值大于n的文档,node.js,mongodb,mongojs,Node.js,Mongodb,Mongojs,例如,考虑到下面所示的数十万个事件文档集合,检索第一个id大于n的事件的最有效方法是什么 示例文件 { _id:NumberLong352757,//保证唯一性 类型:投球, 创建日期:2014-01-01T00:00:00Z, //…后跟未知大小的动态属性 } 当前实施 给定许多事件的集合,检索第一个id大于35的事件 首先,使用聚合检索事件的id 我这样做的前提是,投影阶段返回的id将比在未知大小的完整文档上循环更有效 db.events.aggregate {$project:{{u i

例如,考虑到下面所示的数十万个事件文档集合,检索第一个id大于n的事件的最有效方法是什么

示例文件 { _id:NumberLong352757,//保证唯一性 类型:投球, 创建日期:2014-01-01T00:00:00Z, //…后跟未知大小的动态属性 } 当前实施 给定许多事件的集合,检索第一个id大于35的事件

首先,使用聚合检索事件的id

我这样做的前提是,投影阶段返回的id将比在未知大小的完整文档上循环更有效

db.events.aggregate {$project:{{u id:1}}, {$match:{{u id:{$gt:NumberLong35}}}, {$sort:{{u id:1}}, {$limit:1} 然后,我使用返回的_id调用findOne来检索该文档


你的想法是什么?

不太清楚你在问什么。您的聚合语句基本上是一个带有.find的直接查询,排序顺序错误。最大值应按相反顺序排序,即-1。实际的问题是什么?您的聚合查询是正确的,可以很好地工作,尽管可以使用前面提到的find as@NeilLunn来完成,这更简单。我认为排序顺序是正确的,我想要的是id大于n的第一个最低的文档,而不是最高的文档。我最初是这样做的:db.events.find{{u id:{$gt:1}}}.sort{u id:1}.limit1,但我在这里看到一些帖子,关于find/sort在非常大的集合上速度慢,而map/reduce或聚合更可取。我想问的是,考虑到我处理的文档大小未知、集合非常大、可能有数百万个文档的设计问题,执行此查询的最有效的方法是什么。如果选择的值未编入索引,则与魔鬼代言人的做法有何区别?这些查询如何比较?@christianbradley,您可以在find查询中使用投影来获得{u id:db.events.find{{u id:{$gt:NumberLong35},{u id:1}.sort{u id:1}.limit1,这将是一个覆盖查询。查询条件上没有索引将显著影响性能。对于实际数字,最好对集合运行测试。