我在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以外的其他方式?最终,我希望这样存储数千本书,而无需进行复杂的查询。
答案 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中。更快更便宜