MongoDB不必要的巨大平均文档大小



我有一个MongoDB集合,我在其中保存Commits。这些委员会的平均文件大小为3.6 KB。当我将其中一些委员会分配给时

CommitPath {
commit: Commit;
path?: GitFile; // this is the representation of a file stored in the commit
}

平均文档大小达到约53.9KB,或者在进一步提交的情况下甚至达到约300KB。对于提交中的每个文件,都会创建一个CommitPath对象。CommitPath的平均文档大小应与Commit的大小大致相同,但肯定小于或等于2*sizeof(Commit(,因为CommitPath中存储的唯一更多内容已存储在Commit中。

我使用编译为JavaScript并使用nodejs运行的TypeScript应用程序计算CommitPaths。当我运行nodejs应用程序时,RAM内存中的CommitPaths总大小甚至没有MongoDB中存储的那么高,这似乎非常可疑。我不是在使用Mongoose,而是直接用MongoClient(npm包(保存Object。

我想上传这两个收藏,但我得到了一个";路径c处的路径冲突改变剩余部分改变"-尝试导出CommitPath集合时出错。我已经阅读了Mongodb获取错误消息";MongoError:活动中的路径冲突";但我仍然不明白到底是什么原因导致了这个问题。

有人能解释为什么MongoDB的文档大小如此之大,为什么我在导出集合时会出现这个错误,以及我如何解决这个问题吗

分析文档有助于解决此问题。我用TypeScript这样分析了这个集合:

import * as bson from "bson" // npm i -D bson && npm i -D @types/bson
const client: MongoClient   = await MongoClient.connect(this.dbConfig.url, {useUnifiedTopology: true});
const db                    = client.db(this.dbConfig.dbName);
const collection            = db.collection(collectionName);
const dbContent             = await collection.find({}).toArray();
dbContent.forEach(doc => {
const size = bson.calculateObjectSize(x);
if (size > 100000) {
console.log(doc)
}
}

问题是,影响许多文件的Commit比正常的Commit大(Commit.files更大(,并且对于这些提交中的每个文件,Commit将完全存储在CommitPath对象中,平均文档大小远大于Commit数据库中的平均文档大小。

我仍然不知道为什么MongoDB公司不能导出集合,但它似乎和大的平均文档大小无关。

最新更新