Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB-一个使用索引的集合_Mongodb_Collections_Indexing - Fatal编程技术网

MongoDB-一个使用索引的集合

MongoDB-一个使用索引的集合,mongodb,collections,indexing,Mongodb,Collections,Indexing,好的,随着我在Mongodb中开发的越来越多,我开始怀疑是否需要多个集合,而不是一个带索引的大型集合(因为每个文档的列和字段可能不同于表格数据)。如果我试图以最有效的方式开发(意味着更少的代码和可重用的代码),那么我可以对所有文档使用一个集合,只对一个字段进行索引。通过将所有文档放在一个带有索引的集合中,我可以重用所有表单处理代码和其他代码,因为它们都将插入到同一集合中 例如: 假设我正在开发一个联系人经理,我有两种类型的联系人“个人”和“企业”。我最初的想法是创建一个名为“个人”的集合和第二个

好的,随着我在Mongodb中开发的越来越多,我开始怀疑是否需要多个集合,而不是一个带索引的大型集合(因为每个文档的列和字段可能不同于表格数据)。如果我试图以最有效的方式开发(意味着更少的代码和可重用的代码),那么我可以对所有文档使用一个集合,只对一个字段进行索引。通过将所有文档放在一个带有索引的集合中,我可以重用所有表单处理代码和其他代码,因为它们都将插入到同一集合中

例如:

假设我正在开发一个联系人经理,我有两种类型的联系人“个人”和“企业”。我最初的想法是创建一个名为“个人”的集合和第二个名为“企业”的集合。但这是因为我习惯于在sql中开发,这是合适的,因为每个表的列都是不同的。我越是开始考虑文档dbs的灵活性,我就越会想,“我真的需要两个集合吗?”如果我只是在每个文档中添加一个名为“contact type”的字段并在其上建立索引,我真的需要两个集合吗?由于每个文档中的字段/列不必对所有人都相同(如sql),因此每个文档都可以有自己的字段,只要我有一个“文档类型”字段和该字段上的索引

于是我接受了这个概念,开始思考,如果我只需要一个“个人”和“企业”的集合,那么我甚至需要一个单独的“用户”或“联系历史”或任何其他数据集合。理论上,我不能在一次收集中构建整个解决方案,并且在每个文档中都有一个字段指定“类型”并在其上建立索引,如“用户”、“个人联系人”、“业务联系人”、“联系人历史记录”等,如果它是与另一个文档相关的文档,我可以在“父关键字/外部”Id字段上建立索引

这将允许我动态编码前端,因为表单处理代码都是相同的(插入到相同的集合中)。这将节省大量的编码,但我希望通过使用索引和辅助索引来确保数据库仍能快速运行,并且不会随着集合的增长而导致将来的问题。可以想象,如果所有内容都在一个集合中,随着用户群的增长,该集合中可能会有数十万甚至数百万个文档,但它会有索引和辅助索引来优化性能


我的问题是:这是mongodb开发人员常用的方法吗?为什么?如果有的话,会有什么下降?如果这是一种常用的方法,也请给出使用这种方法的任何积极因素。多谢各位

MongoDB和NoSQL一般都是关于数据去规范化和减少连接的。这与正常的SQL思维背道而驰

在您的情况下,我看不出有任何理由希望有单独的集合,因为它会引入不必要的复杂性和性能开销。例如,如果你想有一个按字母顺序显示所有联系人的屏幕。如果你有一个单一的联系人集合,那么这真的很容易,但是如果你有两个联系人集合,这就变成了一个更复杂的命题


如果您的应用程序有多个用户存储联系人,则我会有多个集合。然后,我将为每个用户创建一个集合。这使得提取用户联系人非常容易。

这是Mongo的一个重要观点,答案更像是一门艺术而不是科学。拥有一个充满巨大文档的集合绝对是一种反模式,因为它与Mongo的许多特性背道而驰

例如,在检索文档时,您只能从集合中检索整个文档(不完全是这样,但大部分是这样)。所以,如果你有巨大的文档,你每次都在检索巨大的文档。此外,拥有大型文档会降低切分的灵活性,因为在每个集合中只有顶级文档被索引(因此切分)。您可以将索引值深入到文档中,但索引值与顶级文档相关联

同时,使用纯关系也是一种反模式,因为首先使用Mongo会丢失很多引用完整性。此外,所有连接都在应用程序内存中完成,因此每个连接都需要一个完整的往返(慢速)

所以答案是在两者之间做点什么。我想在这种情况下,你可能会想要一个个人收藏和一个不同的企业收藏。我之所以这样说,是因为企业似乎有足够的相关元数据,因此可能会大量增加。(另外,我个人业务关系似乎是多对多的关系)。但是,个人可能有一个
名称
对象(具有
第一个
最后一个
属性)。把这个名字编入一个单独的集合是个坏主意

10gen关于架构设计的一些信息:

编辑

此外,Mongo对事务(以原子聚合的形式)的支持也很有限。将对象插入mongo时,将插入或不插入整个对象。因此,您的应用程序域需要某些对象之间的一致性,您可能希望将它们保留在同一文档/集合中

例如,考虑一个应用程序,它要求<代码>用户< /> >总是有<代码>名称<代码>对象(包含<代码>第一个名字<代码>,<代码>如果以某种方式插入了

用户
,但没有相应的
名称
,则数据将被视为已损坏。在RDBMS中,您将围绕插入
User
Name
的操作包装事务。在Mongo中,我们确保
Name
位于同一文档中(aggrega