[英]MondoDB/Mongoose query responce is too slow
我刚接触 MongoDB/Mongoose,并且使用了一个非常大的数据库(超过 25000 个文档)。 我需要配置不同的查询:按字段,前 10 个文档,一个按 id。 问题在于性能 - 服务器响应太慢(大约 10-15 秒)。 请告诉我如何配置它以便服务器响应快速? 它是仅依赖于架构设置,还是还可以依赖于其他东西,例如数据库连接参数或查询参数? PS 查询应按“地区”和“地区”进行。 谢谢你的帮助!
这是架构:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const houseSchema = new Schema({
code: {
type: String,
required: false
},
name: {
type: String,
required: true
},
district: {
type: String,
required: true
},
locality: {
type: String,
required: false
},
recountDate: {
type: Date,
default: Date.now
},
eventDate: {
type: Date,
default: Date.now
},
events: {
type: Array,
default: []
}
});
module.exports = mongoose.model('House', houseSchema);
连接参数:
mongoose.connect(
`mongodb+srv://${process.env.MONGO_USER}:${process.env.MONGO_PASSWORD}@cluster0-vuauc.mongodb.net/${process.env.MONGO_DB}?retryWrites=true&w=majority`,
{
useNewUrlParser: true,
useUnifiedTopology: true
}
).then(() => {
console.log('Connection to database established...')
app.listen(5555);
}).catch(err => {
console.log(err);
});
使用 Relay 执行查询:
query {
viewer {
allPosts (first: 10) {
edges {
node {
id
code
district
locality
recountDate
eventDate
events
}
}
}
}
}
MongoDB 执行查询的速度非常快。 但这也取决于您如何编写查询。 用于获取前 10 个文档并将其降序排序到集合中的 _id。 您需要在查询中使用limit
和sort
。
db.collectionName.find({}).limit(10).sort({_id:-1})
确保这不是连接问题。 尝试从 MongoDB shell 运行您的查询
mongo mongodb+srv://${process.env.MONGO_USER}:${process.env.MONGO_PASSWORD}@cluster0-vuauc.mongodb.net/${process.env.MONGO_DB}?retryWrites=true&w=majority
db.collection.find({condition}).limit(10)
如果在 MongoDB shell 中,它的响应速度比 Mongoose快:
Node.js
驱动程序存在一个问题,它使用纯 Javascript BSON 序列化程序,从 BSON 序列化到 JSON 非常慢。
尝试安装bson-ext
bson-ext
模块是一个用C++
编写的替代 BSON 解析器。 它提供了更好的反序列化性能和与纯 javascript 解析器相似或更好的序列化性能。
使用投影仅返回必要的数据当您只需要文档中的一部分字段时,您可以通过只返回您需要的字段来获得更好的性能:
例如,如果在您对帖子集合的查询中,您只需要时间戳、标题、作者和摘要字段,您将发出以下命令:
db.posts.find( {}, { timestamp : 1 , title : 1 , author : 1 , abstract : 1} ).sort( { timestamp : -1 } ).limit(10)
您可以在此处阅读查询优化
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.