我正在构建一个使用MongoDB作为数据库的应用程序。我有很多产品,我想将用户查看的产品记录到用户的数据库条目中。例如,用户配置文件如下所示:
{
"email" : "foo@bar.com",
"name" : "John Snow",
"_id" : ObjectId("51ecbcc6896652a008000001"),
"productsViewed" : [
product1,
product2,
product3,
product4
]
}
我有两个选择。我只能记录每个产品的_id
,或者我可以记录代表产品的整个对象(名称,价格,~100个单词描述,类别,那种东西)。对象大小的差异是每个产品1行文本与每个产品大约30行。
我意识到这可能需要关注一些微不足道的数据,但如果用户有10,000 productsViewed
个条目,差异会大30倍,会产生什么样的影响?记录更多数据对我的目的来说更有用,但如果用户配置文件变得非常大,我想避免数据库调用滞后。
问题是:在什么时候(字符长度,我猜?)用一条MongoDB记录存储的数据太多了?
答案 0 :(得分:2)
16 Meg是整个文档的限制。这意味着所有字符串等必须适合16兆。但是,在此之前,您的架构存在更多限制,您自己暗示:
但如果用户有10,000个产品查看条目,差异会大30倍,会产生什么样的影响?
答案是肯定的。首先使用root用户添加的数据,您可能会超过16 meg限制,但是,此外,内存中$pull
,$push
和其他子文档操作符可能会很难及时保持表现。您可以通过将子文档批处理为100个组来缓解该问题。
然而,再次,你有一个更大的问题:碎片化。由于MongoDB将记录存储在磁盘上的单个连续空间中,因此它具有类似填充的设置,您可以看到来自奇数大小的记录对象的大量碎片,而不是在此处重复使用。
我个人会说你应该将这种关系分解为一个单独的集合。