我收集了大约 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/