在MongoDB中存储类似结构的更好方法是什么?为每个结构选择一个集合或一个集合?有一个/几个的好处?
例如,我必须存储一些日志,以进行进一步的分析。每个结构都有一个共同的部分,某些统计类型的数据是特定的,例如:
{
timestamp: ...,
client: { ... },
type: 'stats_for_item1',
data: {
id: ObjectId('xxx'),
field1: 1,
field2: 2
}
},
{
timestamp: ...,
client: { ... },
type: 'stats_for_item2',
data: {
id: ObjectId('zzz'),
field3: 3,
field4: {
field5: [5, 1]
}
}
}
如您所见,我们有共同的部分和data
字段,item1
和item2
的字段很少。
似乎只会将timestamp
和type
字段编入索引(当然也是_id)。并且这些项目的数量有限,总共有3种类型。会有很多写入和少量读取
所以,我的问题,如何组织这样的结构?使用一个大集合stats
并将所有内容存储在那里?创建少量集合stats_item1
,stats_item2
和stats_item3
。什么是最佳的?有什么好处?从mongo的角度来看,用于分片/索引/查询/锁定等等?
答案 0 :(得分:3)
我可能会保留一个集合。如果您稍后获得了另一种统计类型,则无需围绕新集合重新构建代码,然后必须添加该集合。您可以通过在“类型”上创建索引来专门搜索具有特定类型的项目,但您也可以搜索所有项目,因为您将它们全部放在具有“timestamp”索引的集合中”。 (请注意,MongoDB还为每个文档添加了一个_id字段,对于那个文档,它也会添加一个索引。)
对于分片,您需要为每个集合选择一个键。我不知道您的写入/读取比率是多少以及您打算如何读取数据,但我怀疑您之后正在进行某种分析。在这种情况下,也许“客户端”上的分片键最有意义。时间戳可能是一个糟糕的选择,因为它会强制所有写入一个碎片。
一个或三个锁定集合之间的区别没有太大区别,因为现在mongoDB不会对每个集合进行锁定(只有每个服务器实例的锁定产生在2.0中,而每个数据库都有锁定产生)在即将到来的2.2)。
欢呼声,
德里克