你好,我想要构建性能最好的mongoDB模式。
一般来说,我的问题是:
什么更好:集合中有巨大的子文档数组(大约10000),或者两个与引用分离的集合(其中一个可能包含50000000条记录)?
详细资料
我有一个包含复杂子文档的mongoDB模型。
var usersSchema = new Schema({
email:{
type: String,
unique: true,
required: true
},
packages : [{
package : {type: Schema.Types.ObjectId, ref: 'Packages'},
from : {type : Schema.Types.ObjectId, ref :'Languages'},
to : {type : Schema.Types.ObjectId, ref :'Languages'},
words : [{
word: {type: String},
progress: {type: Number,default : 0}
}]
}]
});
每个用户可能会有3-10个包含1000个单词的软件包.应用程序可能有超过10000的用户。所以我大概要存五万字左右。但我希望有分页、普通搜索和另一个多汁的mongoDB功能,用于收集words。但是,正如我所知,在子文档中使用这个函数是非常困难的。
我的问题是:对于具有无效分页、搜索和更新功能的系统性能而言,有什么更好的选择,但被用户( SubDocuments )(或)除以另一个记录为5万条记录的独立模型呢?像这样的东西
var wordsSchema = new Schema({
word: {type: String},
progress: {type: Number,default : 0},
user : {type : Schema.Types.ObjectId, ref :'Users'}
}]
});
发布于 2015-09-28 13:34:20
还有什么更好:集合中有巨大的子文档数组(大约10000),或者两个与引用分离的集合(其中一个可能包含50000000条记录)?
这里想到的第一件事是:为什么存储引用的成本是存储在子文档中的成本的5000倍?
好的,看看您的模式,我认为最好的方法是单独收集单词,而不是包。
我看到的第一个危险信号是你在这里的双巢:
packages : [{
package : {type: Schema.Types.ObjectId, ref: 'Packages'},
from : {type : Schema.Types.ObjectId, ref :'Languages'},
to : {type : Schema.Types.ObjectId, ref :'Languages'},
words : [{
word: {type: String},
progress: {type: Number,default : 0}
}]
}]
在当前版本的words
中,MongoDB子文档将很难处理,通常2-3层深度开始出现问题,特别是位置操作符。
现在,考虑到您应该始终从您可以得到的最高值工作:
每个用户可能会有3-10个包含1000个单词的软件包.
你还得考虑一下这份文件的住房成本。您需要的操作符是内存中的操作符,如$pull
、$push
、$addToSet
等,这意味着您的整个文档需要序列化并加载到MongoDB的原生C++结构中。这将是一个非常昂贵的任务,取决于这些文档的流量。
考虑到你的评论:
我想用word集合做很多读和写操作,更不用说对用户集合的操作了。
它只是在将单词嵌入主用户文档的棺材中又加了一个钉子。考虑到我在上一段中说过的话,这与在words
数组上使用内存运算符的成本不太一样。
但我希望有分页,正常的搜索和另一个多汁的mongoDB功能的集合词。
如果将单词拆分,$slice
也是内存中的操作符,这将更好地工作,并且可能会导致这里的性能下降。
这是一个快速合理的反应。我相信我可以解释更多关于我的理由,但这应该就足够了。
发布于 2015-09-27 18:23:02
依我看,分开收藏更好
有几件事要记住
希望它能帮上忙
https://stackoverflow.com/questions/32810204
复制相似问题