为类似的数据结构选择MongoDB集合结构

时间:2012-02-07 08:05:32

标签: mongodb

在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字段,item1item2的字段很少。

似乎只会将timestamptype字段编入索引(当然也是_id)。并且这些项目的数量有限,总共有3种类型。会有很多写入和少量读取

所以,我的问题,如何组织这样的结构?使用一个大集合stats并将所有内容存储在那里?创建少量集合stats_item1stats_item2stats_item3。什么是最佳的?有什么好处?从mongo的角度来看,用于分片/索引/查询/锁定等等?

1 个答案:

答案 0 :(得分:3)

我可能会保留一个集合。如果您稍后获得了另一种统计类型,则无需围绕新集合重新构建代码,然后必须添加该集合。您可以通过在“类型”上创建索引来专门搜索具有特定类型的项目,但您也可以搜索所有项目,因为您将它们全部放在具有“timestamp”索引的集合中”。 (请注意,MongoDB还为每个文档添加了一个_id字段,对于那个文档,它也会添加一个索引。)

对于分片,您需要为每个集合选择一个键。我不知道您的写入/读取比率是多少以及您打算如何读取数据,但我怀疑您之后正在进行某种分析。在这种情况下,也许“客户端”上的分片键最有意义。时间戳可能是一个糟糕的选择,因为它会强制所有写入一个碎片。

一个或三个锁定集合之间的区别没有太大区别,因为现在mongoDB不会对每个集合进行锁定(只有每个服务器实例的锁定产生在2.0中,而每个数据库都有锁定产生)在即将到来的2.2)。

欢呼声,

德里克