如何从MongoDB快速检索大型阵列

时间:2018-10-22 02:25:05

标签: node.js database mongodb express

我在MongoDB集合中有一个500kb的文档,看起来像这样,“内容”数组有5000个条目:

{
  "BookID": "120",
  "Content": ["The day was pretty good", .42], 
             ["The day was great!", .83],
             .....
}

使用Express从Node运行查询所花费的时间太长:500-5000ms

app.get('/sentences', function (req, res) {
  start = Date.now();
  db.collection('Sentences').find({ "BookID": "120"}).toArray(function (findErr, result) {
      if (findErr) throw findErr;
      console.log(Date.now() - start);
      res.send(result[0]);  
  });
}

是否有适当的方法来存储或查询这样的数据并获得快速查询时间,还是我应该使用MongoDB以外的其他方式?最终,我希望这样存储数千本书,而无需进行复杂的查询。

4 个答案:

答案 0 :(得分:0)

使用hint来提高查询性能。

app.get('/sentences/:id', function (req, res) {
 var bookID=req.params.id

 start = Date.now();
      db.collection('Sentences')
     .find()
     .hint("BookID_"+bookID)
     .toArray(function (findErr, result) {
       if (findErr) throw findErr;
        console.log(Date.now() - start);
        res.send(result[0]);  
  });
}

答案 1 :(得分:0)

  

我认为您已经为馆藏建立了索引(如果没有,请   去做。它将使速度大大提高),但查询速度仍然很慢。

由于这是直接获取数据的查询(甚至不是复杂的搜索),因此使用传统方法很难使其更快。但是根据您的用例,您可以使其速度更快,

  

喜欢用Redis缓存结果。

答案 2 :(得分:0)

在查询中使用lean(),如果您不打算在输出文档上执行任何添加,更新,删除命令。使用lean将以javascript提供输出,并且所有mongoose命令都不能在结果文档上使用。 http://www.tothenew.com/blog/high-performance-find-query-using-lean-in-mongoose-2/

db.collection('Sentences').find({ "BookID": "120"}).lean().toArray(function (findErr, result) {
  if (findErr) throw findErr;
  console.log(Date.now() - start);
  res.send(result[0]);  
});

答案 3 :(得分:0)

我最终将数据作为JSON文件存储在S3中。更快更便宜