Моделирование хорошей схемы Mongodb действительно зависит от того, как вы получаете доступ к своим данным. В описанном вами случае вы проиндексируете свой ключ memberships.user_id, который выглядит нормально. Но ваш размер документа будет расти, так как вы будете добавлять зрителей, редакторов и администраторов. Кроме того, ваша схема будет затруднять создание запросов, таких как:
Запрос проектов, где user_id xxx является редактором:
Опять же, вам, возможно, не нужно запрашивать подобные проекты, поэтому ваша схема выглядит хорошо. Но если вам нужно запросить свои проекты по роли user_id AND, я бы порекомендовал вам создать коллекцию 'project_membership':
db.project_memberships.insert(
{
"project_id" : ObjectId("4d730fcfcedc351d67000032"),
"editors" : [
ObjectId("4d730fcfcedc351d67000002"),
ObjectId("4d730fcfcedc351d67000004")
],
"viewers" : [
ObjectId("4d730fcfcedc351d67000002"),
ObjectId("4d730fcfcedc351d67000004"),
ObjectId("4d730fcfcedc351d67000001"),
ObjectId("4d730fcfcedc351d67000005")
],
"administrator" : [
ObjectId("4d730fcfcedc351d67000011"),
ObjectId("4d730fcfcedc351d67000012")
]
}
)
db.project_memberships.ensureIndex({"editors": 1})
db.project_memberships.ensureIndex({"viewers": 1})
db.project_memberships.ensureIndex({"administrator": 1})
Или еще проще ... добавить индекс в схему проекта:
db.projects.ensureIndex({"memberships.role": 1})