我有一个只有2个文档的mongodb数据库。两者具有相同的结构:
{ "general" { "name": "abc", "sid": "435435"},"resources":[{"id":1,"cnt":20}] "messages" : []}
小文档在消息中有0个对象,大文档有1000个。我数了数这两份文件上的标牌:小:28000大:450000
我使用nodeJS和常规mongodb驱动程序访问文档,并且我将索引设置为“general.sid”。
现在我要他们的将军提供文件。而且这两个文档的时间差别很大!我接收文档,进行一些计算并更新文档。
我打印接收和更新文档之前和之后的时间我做了几次这个查询:
接收:小文档时长:1-2ms
接收:大文件时间跨度:7-20ms
书写:小文档时长:1-2ms
书写:大文档时间跨度:5-10ms
接收函数代码:
db.get().collection('player_data').find({"general.sid":UID}).limit(1).toArray(function (err, result){
if(err){
reject(null);
}
resolve(result);
});
为什么会有这么大的差异?
我不是一个专业的mongodb或nodejs,所以请告诉我,如果你需要任何其他的数据!
差异来自于你已经说过的,文档大小的差异。
索引查询首先扫描索引B树,一旦找到匹配项,它就开始获取文档,而特定文档的索引扫描时间可能会有所不同(取决于树的大小以及文档在树中的位置)。在您的例子中,一个包含两个文档的集合和一个无数组字段上的简单索引查询的索引扫描部分将是相同的。
这将使我们进入find
查询的下一部分,将匹配的文档读入内存,在这里毫不奇怪,更多的字节要加载到内存中。查询将花费更多时间。很难对write
函数给出确切的解释,因为没有多少人确切知道Mongo是如何更新文档的,但我想如果更新一个不是messages数组的字段,差异也可以忽略不计。
如果您要求为db提供更好的“设计模式”,这完全取决于您的日常需求,但为了解决当前的问题,我建议将messages
保存在一个单独的集合中。