在MongoDb中将数据存储为对象与数组以提高写入性能
storing data as object vs array in MongoDb for write performance
我应该将对象存储在数组中还是存储在给定写入速度的最重要的对象中?
我正在尝试决定是应该将数据存储为对象数组,还是在 mongodb 文档中使用嵌套对象。
在这种特殊情况下,我正在跟踪我添加和更新的一组不断更新的文件,文件名充当键和文件中处理的行数。
文档看起来像这样
{
t_id:1220,
some-other-info: {}, // there's other info here not updated frequently
files: {
log1-txt: {filename:"log1.txt",numlines:233,filesize:19928},
log2-txt: {filename:"log2.txt",numlines:2,filesize:843}
}
}
或者这个
{
t_id:1220,
some-other-info: {},
files:[
{filename:"log1.txt",numlines:233,filesize:19928},
{filename:"log2.txt",numlines:2,filesize:843}
]
}
我假设处理文档,尤其是在更新方面,处理对象更容易,因为对象的位置可以通过名称确定;不像数组,我必须查看每个对象的值,直到找到匹配项。
因为对象键会有句点,所以我需要转换(或删除)句点以创建一个有效的键(fi.le.log
到 filelog
或 fi-le-log
)。我不担心文件可能出现的重复名称(例如fi.le.log
和fi-le.log
),所以我更喜欢使用对象,因为文件数量相对较少,但更新频繁。
或者最好在单独的集合中处理此数据以获得最佳写入性能......
{
"_id": ObjectId('56d9f1202d777d9806000003'),"t_id": "1220","filename": "log1.txt","filesize": 1843,"numlines": 554
},
{
"_id": ObjectId('56d9f1392d777d9806000004'),"t_id": "1220","filename": "log2.txt","filesize": 5231,"numlines": 3027
}
我了解,您谈论的是写入速度,没有任何读取考虑。因此,我们必须考虑如何插入/更新文档。
我们必须进行比较(假设您知道要替换_id
,请在示例中log1-txt
或log2-txt
中将{key}
替换为键名):
db.Col.update({ _id: '' }, { $set: { 'files.{key}': object }})
与
db.Col.update({ _id: '', 'files.filename': '{key}'}, { $set: { 'files.$': object }})
第二个意味着MongoDB必须浏览数组,找到匹配的索引并更新它。第一个意味着MongoDB只是更新指定的字段。
最差的:如果数组中不存在匹配的filename
,则第二个命令将不起作用!所以你必须执行它,检查nMatched
是否为 0,如果是,则创建它。这真的是很糟糕的写入速度(参见此处MongoDB:upsert子文档)。
如果您永远不会/几乎从不在此集合上使用读取查询/聚合框架:请选择第一个,那会更快。如果你想聚合,展开,对你解析的文件做一些分析,以获得关于文件大小和行号的统计数据,你可以考虑使用第二个,你会避免一些头痛。
使用第一个解决方案,纯写入速度会更好。
- JavaScript数组优化以提高性能
- javascript散列/数组混合性能
- 哪一个在访问数组长度方面的性能更好
- Javascript性能:如何在数组中循环并检查每个值比indexOf、search和match更快
- 捕获异常,而不是比较性能的数组值
- 在JavaScript性能方面模拟结构处理的C数组
- 面对非常糟糕的 angular.copy 用于大型数组的性能
- 在MongoDb中将数据存储为对象与数组以提高写入性能
- 诉诸数组中不存在的元素,会大大降低性能
- Javascript图像数据到多维数组性能问题
- Javascript 对象与数组性能
- 什么最适合性能:带键的数组或包含数组的键
- 使用动态生成的数据数组进行 ng 重复的性能
- 在循环中缓存数组查找是否有任何性能提升
- ClojureScript数组性能需要mod吗?或者它只是关于边界检查
- Javascript中嵌套for循环与数组函数的性能
- 处理大型数组时的JavaScript性能
- 即使使用较小的块,Javascript数组性能也会崩溃
- 对于循环性能:将数组长度存储在变量中
- 任何提高JavaScript数组性能的方法