Die Modellierung eines guten Mongodb-Schemas hängt wirklich davon ab, wie Sie auf Ihre Daten zugreifen. In Ihrem beschriebenen Fall indizieren Sie Ihren Mitgliedschaftsschlüssel „memberships.user_id“, was in Ordnung zu sein scheint. Aber Ihre Dokumentgröße wird wachsen, wenn Sie Betrachter, Bearbeiter und Administratoren hinzufügen. Außerdem erschwert Ihr Schema Abfragen wie:
Projekte abfragen, bei denen user_id xxx Bearbeiter ist:
Auch hier müssen Sie Projekte wie dieses möglicherweise nicht abfragen, sodass Ihr Schema gut aussieht. Aber wenn Sie Ihre Projekte nach user_id UND Rolle abfragen müssen, würde ich Ihnen empfehlen, eine 'project_membership'-Sammlung zu erstellen:
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})
Oder noch einfacher ... fügen Sie Ihrem Projektschema einen Index hinzu:
db.projects.ensureIndex({"memberships.role": 1})