我是MongoDB / Mongoose的新手,可以使用非常大的数据库(超过25000个文档)。我需要配置不同的查询:按字段,前10个文档,按ID。问题出在性能上-服务器响应太慢(大约10-15秒)。 请告诉我如何配置它,以便服务器响应快速? 它是否仅依赖于架构设置,或者还可以依赖于其他事物,例如数据库连接参数或查询参数? 附言查询应按“区”和“位置”进行。 感谢您的帮助!
以下是架构:
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);
});
使用中继执行查询:
query {
viewer {
allPosts (first: 10) {
edges {
node {
id
code
district
locality
recountDate
eventDate
events
}
}
}
}
}
答案 0 :(得分:2)
MongoDB在执行查询方面非常快。但这也取决于您如何编写查询。为了获取前10个文档并将其从集合到_id的降序排序。您需要在查询中使用limit
和sort
。
db.collectionName.find({}).limit(10).sort({_id:-1})
答案 1 :(得分: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中,它的响应时间比猫鼬快:
Node.js
驱动程序存在一个问题,该驱动程序使用纯Javascript BSON serializer,从BSON序列化为JSON的速度非常慢。
尝试安装bson-ext
bson-ext
模块是用C++
编写的备用BSON解析器。与纯JavaScript解析器相比,它提供了更好的反序列化性能和相似或更好的序列化性能。
答案 2 :(得分:1)
使用投影只返回必要的数据 当您只需要文档中的一部分字段时,可以通过仅返回所需的字段来获得更好的性能:
例如,如果在对posts集合的查询中仅需要时间戳记,title,author和abstract字段,则将发出以下命令:
db.posts.find( {}, { timestamp : 1 , title : 1 , author : 1 , abstract : 1} ).sort( { timestamp : -1 } ).limit(10)
您可以阅读查询优化here