2012-02-07 105 views
3

在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_item1,stats_item2stats_item3。什么是最佳?有什么好处?从Mongo的角度来看,分片/索引/查询/锁定/等?

回答

3

我可能会保留一个集合。如果您稍后获得另一个统计类型,则无需重新构建您需要添加的新集合的代码。您可以通过在“类型”上创建索引来专门搜索具有特定类型的项目,但是您也可以通过所有项目进行搜索,因为您将它们全部放入具有“时间戳”索引的集合中。 (请注意,MongoDB还会为每个文档添加一个_id字段,并且该字段也会添加一个索引)。

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

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

欢呼声,

德里克