MongoDb大型数组与许多小型文档各有一个数组项

时间:2019-02-01 08:52:48

标签: mongodb

我有一个问题,如何在mongoDb中存储一些碰巧很大且大小定期变化的简单数据。

我想存储每个用户“收件箱”中的所有threadId。

threadIds是看起来像“ 168849c793fa996a”的字符串。用户拥有10,000+(〜400KB)或什至偶尔多达50,000+(〜2MB)的threadId可能很常见。

我的应用程序有助于清除收件箱(删除和排序邮件)

我将使用这些信息来了解用户收件箱的当前状态,即哪些邮件已被删除以及哪些新邮件已到达。

因此,数组将每隔半更新一次,并且每次更新时其大小可能都会发生显着变化。

这给我留下了两个关于如何存储数据的想法

  1. 如果我这样存储文档:

    {
      _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()时,我的应用程序本身加载数据的速度非常快。)

  1. 如果我这样存储文档:

    {
      _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之间波动,而且每次查询时我可能总是需要整个数组。我可以代表,存储和更新这些数据的最佳方式(最“正确”)是什么?

0 个答案:

没有答案