我有一个问题,如何在mongoDb中存储一些碰巧很大且大小定期变化的简单数据。
我想存储每个用户“收件箱”中的所有threadId。
threadIds是看起来像“ 168849c793fa996a”的字符串。用户拥有10,000+(〜400KB)或什至偶尔多达50,000+(〜2MB)的threadId可能很常见。
我的应用程序有助于清除收件箱(删除和排序邮件)
我将使用这些信息来了解用户收件箱的当前状态,即哪些邮件已被删除以及哪些新邮件已到达。
因此,数组将每隔半更新一次,并且每次更新时其大小可能都会发生显着变化。
这给我留下了两个关于如何存储数据的想法
如果我这样存储文档:
{
_id: ObjectID,
userId: String,
threadIds: [String]
}
a。使用db.collection.findOne()可以轻松查询threadId数组。
b。使用db.collection.updateOne()(或者也许是db.collection.deleteOne()和db.collection.insertOne()来进行更新很容易,以避免文档大小的巨大波动)。
但是...
c。我已经读过,对于数据库而言,如此大小的文档发生根本改变是不利的
d。我的经验是,如果页面上有几个这样大小的文档,则其中包含10,000+个字符串的数组可使Compass挂起〜10-15秒,而如果尝试查看该数组则挂起20-30秒在包含它的文档中。 (尽管当调用findOne()时,我的应用程序本身加载数据的速度非常快。)如果我这样存储文档:
{
_id: ObjectID,
userId: String,
threadId: String
}
a。通过使用带有userId索引的db.collection.find()。distinct({userId:userId})查询,可以很容易地获得所有threadId的数组。
b。这似乎与许多较小文档的mongoDb方法更加内联,并且在Compass用户界面内更加友好。
但是...
c。更新信息会稍微困难些,因为每次更新时我都必须使用db.collection.deleteMany()和db.collection.insertMany()。
d。这会给我的应用增加少量到中等的额外复杂性。考虑到数组中保存的数据大小在〜5KB到2MB之间波动,而且每次查询时我可能总是需要整个数组。我可以代表,存储和更新这些数据的最佳方式(最“正确”)是什么?