我的收藏品大约有500份文件,几周后会翻倍:
如何更快地获取所有文件?我目前正在使用db.registrations.find(),这样我就可以拥有所有可用于搜索,排序和过滤数据的文档。使用跳过/限制可以快速显示查询,但是您无法搜索玩家的所有注册,这是必要的。
我的架构:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var playerSchema = new mongoose.Schema({
first: {
type: String,
required: true
},
last: {
type: String,
required: true
},
email: {
type: String,
required: true
},
phone: {
type: String,
required: true
},
address: {
address: String,
city: String,
state: String,
zip: String,
country: {
type: String,
"default" : "USA"
},
adult: Boolean
}
});
var registrationsSchema = new mongoose.Schema({
event : {
type: String,
required: true
},
day : {
type: String,
required: true
},
group : {
type: String,
required: true
},
field : {
type: String,
},
price : {
type: Number,
required: true
},
players : [playerSchema],
net : Number,
team : {
type: Number,
min: 0,
max: 7,
"default" : null
},
notes: String,
paymentID : {
type: String,
required: true,
"default": "VOLUNTEER"
},
paymentStatus : {
type: String,
"default" : "PAID"
},
paymentNote : String,
// users : [userSchema],
active : {
type: Boolean,
default: true
},
users: [{
type: Schema.Types.ObjectId,
ref: 'User'
}],
createdOn : {
type : Date,
"default" : Date.now
},
updatedLast : {
type: Date
}
});
mongoose.model('Registration', registrationsSchema);
答案 0 :(得分:2)
使用mongoose从mongodb加载1000条记录没什么大不了的。我过去做过(2-3k记录),只要我遵守这两条规则就行得很好:
使用lean查询。
它不会加载所有mongoose方法/属性,只加载对象中的数据。您无法使用.save()
或其他方法,但加载的速度更快。
Streams是使用nodejs / mongoose加载大型数据集的好方法。它将从mongodb逐块读取数据并将其发送到您的应用程序以供使用。你会避免这个典型案例:
- 我的数据等待2秒,我的服务器空闲
- 我的服务器在2秒内是100%CPU来处理我得到的数据并且数据库空闲。
使用流,在此示例中,您的总时间将是~2s而不是2 + 2 = 4s
要使用mongoose从流加载数据,请使用.cursor()功能将您的请求更改为nodejs stream。
以下是快速加载所有玩家的示例
const allPlayers = [];
const cursor = Player.find({}).lean().cursor();
cursor.on('data', function(player) { allPlayers.push(player); }).
cursor.on('end', function() { console.log('All players are loaded here'); });
答案 1 :(得分:1)
您可以使用以下方式实现目标。
默认情况下,如果您查询mongoose文档,它将加载其所有属性和所需的其他必要元数据(即,使用lean = false)。因此,如果你使用lean()函数,它将只加载一个普通的java脚本对象,它甚至不会返回setter和相应的getter方法。这样你就可以非常快速地获得所有文件。而你将获得高性能。这就是瘦()在背景上的神奇功能。
另一个建议是作为一个拇指规则,请根据您对每个集合的要求维护正确的索引,以便在查询时获得良好的性能。
希望这会对你有帮助!