仅使用MongoDb的一个集合

时间:2017-05-29 15:48:35

标签: python mongodb

以下是快速版本:

是否可以将MongoDb数据库的所有文档保存在一个stuff集合中,而不是在不同的studentsschoolsmessages集合中组织数据库?< / p>

以下是版本:

我正在学习使用MongoDb处理一个新的应用程序,其数据库组织如下:

db.messages
{'recipients': ['student 1', 'student 2', 'school 1', 'school 2'], 'text': 'hello!'}

db.students
{'_id': 1, 'name': 'mary'}
{'_id': 2, 'name': 'joseph'}

db.schools
{'_id': 1, 'name': 'middle'}
{'_id': 2, 'name': 'high'}

查找邮件的所有收件人列表需要将recipients列表转换为两个列表,然后为每个集合运行一个查询。除了这项额外的工作之外,按日期skiplimitsort一起使用会很困难(聚合后应用程序必须完成skip两个查询结果,而不是数据库)。

我认为如果数据库的组织结构会更容易:

db.stuff
{'_id': 1, '_type': 'message', 'recipients': [2, 3, 4, 5], 'text': 'hello!'}
{'_id': 2, '_type': 'student', 'name': 'mary'}
{'_id': 3, '_type': 'student', 'name': 'joseph'}
{'_id': 4, '_type': 'school', 'name': 'middle'}
{'_id': 5, '_type': 'school', 'name': 'high'}
db.stuff.create_index([('_type', 1)])

使用此组织,一个查询可以查找任何类型的文档,并且查询的灵活性要高得多。删除集合使数据库更加无架构

在阅读(大部分)文档和一堆博客之后,我认为唯一的限制是最大number of indexes per collection为64.

64这是唯一的限制吗?或者我错过了以后可能会咬我的东西?

1 个答案:

答案 0 :(得分:0)

从技术上讲,非常欢迎您将所有数据存储在一个集合中,并实现自己寻找不同类型数据的方式(您使用的_type属性可以正常工作)。我不知道MongoDB在单个集合中存储大量数据与多个集合时存在的任何其他限制。

然而,这在实践中是一个非常糟糕的主意。首先,如果您有一个正式的架构(比如在常规的SQL数据库中),那么您的数据结构良好,并且更容易使用。当你有大量看起来像JSON的数据但是每个元素的字段略有不同时,Mongo真的很闪耀。想象一下从API中获取数据,它为您提供了一个包含100个不同键的JSON blob,但您现在只对两个或三个字段感兴趣。将整个blob存储在Mongo中是有意义的,因为将来查询所有这些额外字段将非常容易。

综上所述,任何主要数据库都可能在几毫秒内使用几个索引处理所有查询。

在您的特定情况下,我认为您应该修复您的架构而不是合并集合。特别是,每条消息上的recipients列表(我假设)是两个不同集合中的文档的ID列表。如果学校和学生有显着差异,那么他们可能不应该被归为recipients。如果学生和学校几乎相同,我会将它们放入一个集合(称为recipients)并添加一个名为isStudent的字段来区分这两者。虽然这与您的_type字段类似,但邮件与其他两个邮件在同一集合中没有业务。

如果学校和学生有显着差异,但您仍坚持使用recipients的单一列表,我建议您添加一个recipients表,其中包含schools之间的所有常用字段和students。您还需要recipientId附加到每个schoolstudent。所以像这样:

db.messages
{ recipients: [RecipientIds], text: String }

db.recipients
{ name: String } // Add additional shared attributes here.

db.students
{ recipientId: ObjectId, school: ObjectId, birthday: Date, ... }

db.schools
{ recipientId: ObjectId, phone: String, ... }