Mongodb:多个特定的集合或一个" store-it-all"性能/索引的集合

时间:2012-03-23 09:05:47

标签: mongodb nosql

我正在记录用户在我们网站上执行的不同操作。每个操作可以是不同类型:注释,搜索查询,页面视图,投票等......这些类型中的每一个都有自己的架构和常用信息。例如:

comment : {"_id":(mongoId), "type":"comment", "date":4/7/2012, 
           "user":"Franck", "text":"This is a sample comment"}

search : {"_id":(mongoId), "type":"search", "date":4/6/2012, 
          "user":"Franck", "query":"mongodb"} etc...

基本上,在OOP或RDBMS中,我会设计一个Action类/表和一组继承的类/表(Comment,Search,Vote)。

由于MongoDb架构较少,我倾向于设置一个唯一的集合(“Actions”),我将存储这些对象而不是多个集合(集合Actions +集合注释,其链接键为其父Action等。 ..)。

我的问题是:如果我尝试按特定列搜索,性能/响应时间会怎样?

据我了解索引最佳实践,如果我想“每个用户都在搜索mongodb”,我会将列标记为“type”+“query”。但它不涉及整套数据,只涉及“搜索”类型的数据。

MongoDb引擎会扫描整个表还是只关注具有此特定架构的数据?

2 个答案:

答案 0 :(得分:3)

如果您创建sparse indexes mongo将忽略任何没有密钥的行。虽然稀疏索引存在they can only index one field的特定限制。

但是,如果您只使用公共字段进行查询,则绝对没有理由不使用单个集合。

即。如果用户+类型(或日期+用户+类型)的索引将满足您的所有查询需求 - 没有理由创建多个集合

提示:对日期使用日期对象,在适当的位置使用对象ID而不是名称。

答案 1 :(得分:0)

以下是MongoDB's Best Practices

中的一些有用信息
  

将记录的所有数据存储在单个文档中。

     

MongoDB在文档级别提供原子操作。当数据   对于记录,整个记录都可以存储在单个文档中   在单个搜索操作中检索,这非常有效。在一些   将所有数据存储在单个文档中可能不切实际,   或者它可能会对其他操作产生负面影响。做出权衡   最适合您的应用。

     

避免使用大型文档。

     

MongoDB中文档的最大大小为16MB。在实践中最多   文件是几千字节或更少。考虑更像的文件   表中的行而不是表本身。而不是维持   单个文档中的记录列表,而是使每个记录成为一个   文献。对于大型媒体文档,例如视频,请考虑使用   GridFS,由存储的所有驱动程序实现的约定   许多小文档中的二进制数据。