0

Ich bin neu zu mongodb NoSQL Konzept und fest an der Stelle, wo ich nicht in der Lage bin, eine Entscheidung für die Modellierung des Schemas zu treffen, das meinem Zweck am besten dienen könnte.Mongodb Schema für Beiträge und Freigaben

Ich muss Schema so gestalten, dass ich mein Endergebnis als Posts und Shares nach Zeit sortiert haben. Dafür hielt ich zwei Möglichkeiten:


Option 1: Verschiedene Sammlung Beiträge and Share als:

Schema für Beitrag Sammlung:

var postSchema = mongoose.Schema({ 
    postText: String, 
    postedBy: String, 
    privacy: Number, 
    updatedOn: { type: Date, default: Date.now }   
}, { collection: 'posts' }); 

Schema für die Anteils Sammlung

var shareSchema = mongoose.Schema({ 
    dis_Id: { type: mongoose.Schema.Types.ObjectId }, // Id of post that is shared 
    shareBy: { type: mongoose.Schema.Types.ObjectId }, 
    shareText: String, 
    share_privacy: Number, 
    shareOn: { type: Date, default: Date.now } 
}, { collection: 'shares' }); 

Option 2: Einbetten Teile in Beiträgen selbst

Neues Schema für Beitrag

var postSchema = mongoose.Schema({ 
    postText: String, 
    postedBy: String, 
    updatedOn: { type: Date, default: Date.now }, 
    privacy: Number, 
    share: { 
    shareBy: { type: mongoose.Schema.Types.ObjectId }, 
    shareText: String, 
    share_privacy: Number, 
    shareOn: { type: Date } 
    }  
}, { collection: 'posts' }); 

Nun, die hierfür könnte eine bessere Wahl sein? Option 1 hat Probleme beim Abfragen, da es keine Verbindungen in mongodb gibt, und Option 2 führt zur Replikation derselben Daten und kann für Hunderttausende von Benutzern auf mehr als Milliarden anwachsen.

+0

Ich bin immer noch nicht klar, warum die erste Option nicht praktikabel ist. Ich stimme zu, dass Join in mongodb für Online-Abfragen nicht unterstützt wird. Mit diesem [post] (https://stackoverflow.com/questions/5681851/mongodb-combine-data-from-multiple-collections-into-one-how) können Sie Join für Offline-Prozesse verwenden. Wie ist die erste Option, die den Zweck vereitelt, nicht klar? Kannst du es ausarbeiten? –

+0

** MapReduce ** Technique gibt ein ** BSON-Dokument ** zurück, das eine maximale Größe von ** 16mb ** haben kann, so dass die Anzahl der Posts und die Anzahl der Freigaben pro Post erhöht werden kann und die 16mb-Größe des resultierenden Dokuments –

+0

erreicht OK. Ich stimme Ihnen hinsichtlich der Verwendung von map-reduce zu. Aber ich kann immer noch nicht verstehen, warum die erste Option nicht hilfreich ist. Ich meine, wenn Sie Ihre API-Anfragen oder Anwendungsfälle definieren können, wird es klarer. –

Antwort

0

Ok. Ich schlage vor, den folgenden Ansatz:

  1. Da Sie bereits den Benutzernamen haben, können Sie die Liste der Post abrufen zu dieser Id in einer sortierten Reihenfolge entsprechend mit sort.

  2. Wenn Sie über jeden Beitrag iterieren, können Sie die Freigaben in sortierter Reihenfolge abrufen, indem Sie die gleiche Art verwenden, die oben verwendet wurde.

Der Schlüssel hier ist zu verstehen Indizes, die Sie einstellen werden. Ich schlage vor, Sie sollten folgende Indizes haben.

post_schema: Verbindung Index auf {Benutzername, updatedOn}

share_schema: Verbindung Index auf {dis_Id, ShareOn}.

Wenn keine zusammengesetzten Indizes verwendet werden, wird Ihre Anwendung nicht für eine große Anzahl von Datensätzen skaliert.

+0

Hier gibt es ein weiteres Problem: Obwohl ich ** Beiträge ** und ** Anteile ** jeweils in sortierter Reihenfolge bekomme, aber ich brauche weitere Sortierung mit Mischung von Beiträgen und teilen. ** für zB **: wenn (A) um 9 Uhr gepostet wurde, wurde um 15 Uhr geteilt (A1), während B um 12 Uhr gepostet wird. Laut ur Logik werde ich A bekommen, dann A1 als B, aber ich brauche die Reihenfolge A, dann B dann A1. –

+0

ok, von dem, was ich verstehe, müssen Sie benutzerdefinierte Logik schreiben, um diese Freigaben/Post zusammenzuführen. map-reduce facility von mongo wird nicht hilfreich sein, wenn Sie alle Datensätze in einer einzigen Zeile anhängen. Wenn Sie jedoch so verfahren, dass der einzelne Eintrag von post/share eine einzelne Zeile ist, kann dies mit MR erfolgen. Abschließend müssen Sie benutzerdefinierte Logik schreiben, um es zu tun. –

0

Nun, es ist einfach mit eingebetteten Dokumenten zu arbeiten, da Sie alle erforderlichen Daten zusammen bekommen, so dass Option 2 in diesem Fall gut ist. Aber wenn Sie über die Größe von Dokumenten besorgt sind, die mehr als 16 MB erhöhen, gehen Sie mit Option 1 vor. Verwenden Sie in diesem Fall keine Aggregatabfrage, um zwei Sammlungen zu verbinden, da dies zeitraubende Operation ist Betrieb überspringen. Stattdessen sollten Sie jede Sammlung einzeln abfragen und mit einer benutzerdefinierten Logik eine vollständige Antwort erstellen.

+0

Nun, wie mache ich das mit Option 2, wenn ich folgendes bedenke: Hier gibt es ein weiteres Problem: Obwohl ich Posts und Shares in sortierter Reihenfolge bekomme, brauche ich aber weitere Sortierung mit Mischung von Posts und Shares. zB: wenn (A) um 9 Uhr gepostet wurde, wurde um 15 Uhr (A1) geteilt, während B um 12 Uhr gepostet wird. Laut ur Logik werde ich A bekommen, dann A1 als B, aber ich brauche die Reihenfolge A, dann B dann A1 –

+0

dafür müssen Sie benutzerdefinierten Code schreiben. Rufen Sie die Dokumente aus der gewünschten Sammlung ab und führen Sie sie in der von Ihnen gewünschten Reihenfolge zusammen. – Ricky

+0

Und wie sollte ich sie zusammenführen ... Mit Aggregation oder auf andere Weise? –

Verwandte Themen