javascript - 从 mongodb 游标中检索每个第 x 个元素的有效方法

标签 javascript node.js mongodb

我收集了大约 500 万份文档,而且还在不断增加。所有这些文档都有一个位置字段。位置字段上也有一个索引。这些文档显示在 map 上。当我放大时,我仅检索具有限制的查看区域范围内的点。缩小时,我想显示 x 点,但不是全部显示在一个区域中( x 比总集合小很多)。我想实现类似从数据库返回每 20 个元素的功能,因此我在每个区域都得到了点,这在高缩放级别下应该是一个很好的概述。我现在有了类似的东西并且它可以工作,但是它不是很快,因为我正在迭代其中的每个项目。

 let itemCount = 0;
 let someItems = [];
 cursor.forEach((item) => {
   if (!(++itemCount % 20)) someItems.push(item);
 }, (err) => {
   if (err) throw err;
   res.json(someItems);
 });

当前的实现大约需要 5 秒,在我看来,这对于用户来说等待的时间太长了。有没有类似跳过光标项目的功能?我已经阅读了有关光标使用的批处理的信息。如果batchSize 是20,我可以只取每批的第一个项目。不过,我还没有找到手动检索下一批的方法。提高此操作速度的好方法是什么?

PS。我正在使用 Node.js MongoDB native 驱动程序。

最佳答案

您可以使用类似于随机跳过列表的东西。基本上每次插入这样的项目时,都会随机为其分配一个“可见性”,可见性越高,具有该可见性的项目就越少。

例如,您可以使用visibility = Floor(log2(random(2^10)))

假设您最终得到了一系列如下文档:

{
  "name": "apple",
  "visibility": 0,
},
{
  "name": "orange",
  "visibility": 0,
},
{
  "name": "banana",
  "visibility": 1,
},
{
  "name": "mango",
  "visibility": 2,
},

然后,您可以设计索引并根据位置和可见性执行查询。增加查询中的最小可见性以使返回的项目更加稀疏。

关于javascript - 从 mongodb 游标中检索每个第 x 个元素的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47791778/

相关文章:

javascript - 使用 Angular 5 在 firebase 中存储数据时无法读取未定义的属性 'push'

javascript - 我如何在 adonis.js 中建立我的 belongsToMany 关系

node.js - mongodb 中 $nin 的非严格行为

php - PHP 中的 MongoDB 3.4 排序规则

javascript - 如何制作倒数计时器并在时间到时更新MySQL记录?

javascript - 如何在没有输入的情况下发送文件[类型 ="file"]

json - 从 Node.js 服务器 native 访问 JSON POST 负载

javascript - 尝试使用 Express 将数据插入 MySql 数据库时出错

javascript - 尝试通过 Expo (React Native) 启动应用程序时从 NodeJS 获取 EISDIR 错误

mongodb - Node/Express 应用程序无法连接到 docker mongodb