我正在记录用户在我们网站上执行的不同操作。每个操作可以是不同类型:注释,搜索查询,页面视图,投票等......这些类型中的每一个都有自己的架构和常用信息。例如:
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引擎会扫描整个表还是只关注具有此特定架构的数据?
答案 0 :(得分:3)
如果您创建sparse indexes mongo将忽略任何没有密钥的行。虽然稀疏索引存在they can only index one field的特定限制。
但是,如果您只使用公共字段进行查询,则绝对没有理由不使用单个集合。
即。如果用户+类型(或日期+用户+类型)的索引将满足您的所有查询需求 - 没有理由创建多个集合
提示:对日期使用日期对象,在适当的位置使用对象ID而不是名称。
答案 1 :(得分:0)
将记录的所有数据存储在单个文档中。
MongoDB在文档级别提供原子操作。当数据 对于记录,整个记录都可以存储在单个文档中 在单个搜索操作中检索,这非常有效。在一些 将所有数据存储在单个文档中可能不切实际, 或者它可能会对其他操作产生负面影响。做出权衡 最适合您的应用。
避免使用大型文档。
MongoDB中文档的最大大小为16MB。在实践中最多 文件是几千字节或更少。考虑更像的文件 表中的行而不是表本身。而不是维持 单个文档中的记录列表,而是使每个记录成为一个 文献。对于大型媒体文档,例如视频,请考虑使用 GridFS,由存储的所有驱动程序实现的约定 许多小文档中的二进制数据。