2016-05-21 7 views
0

Ich frage mich, was die "Mongo Way" für die Modellierung eines ausstehenden Handels eines Artikels zwischen zwei Benutzern ist.Wie modelliere ich einen ausstehenden Trade in MongoDB?

Ich habe eine Benutzersammlung und ich habe eine Büchersammlung. In meiner App können die Nutzer einander Trades vorschlagen. Bis der Handelsvorschlag akzeptiert wird, muss der Handel als ausstehender Handel in der Datenbank gespeichert werden.

Es scheint mir, dass die beste Option, um eine ‚Gewerke‘ Eigenschaft auf jedem Buch Dokument wie folgt aus (mit Mongoose) modelliert zu haben ist:

const booksSchema = new Schema({ 
    title: { type: String, required: true }, 
    createdAt: { type: Date, 'default': Date.now }, 
    updatedAt: { type: Date, 'default': Date.now }, 
    author: { type: String, required: false}, 
    imageUrl: { type: String, required: false}, 
    ownerUser: { type: Schema.ObjectId, required: true }, 
    trades: [{ 
    fromUser: { type: Schema.ObjectId, required: true }, 
    bookOffered: { type: Schema.ObjectId, required: true } 
    }] 
}); 

Das Problem, das ich mit diesem zu sehen ist, dass es einbezieht Aktualisierung von zwei Dokumenten, wenn der Handel akzeptiert wird. Unter der Annahme, dass der Handel akzeptiert wird, muss die ownerUser für jedes Dokument geändert werden und das trades Array muss gelöscht werden.

Es scheint so, als würden Sie die Änderungen in einer Art "Transaktion" haben wollen, so dass, wenn jemand aus irgendeinem Grund nicht aktualisiert würde, auch der andere nicht.

Ist dies ein typischer Weg, um diese Art von Situation zu modellieren? Was ist mit dem "Transaktions" -Teil der Situation zu tun?

+0

Also hätte jedes Buchbeispiel einen eigenen Eintrag? Sie sollten _id auch in Ihr Schema aufnehmen. –

+0

Das ist automatisch von Mongoose enthalten, denke ich. – alwayslearning

+0

MongoDB selbst wird eine _id für Sie auf dem Server injizieren. –

Antwort

0

Es gibt keine Möglichkeit, eine Transaktion mit mehreren Dokumenten in MongoDB auszuführen. Sie könnten eine eigene Handels Sammlung mit Dokumenten wie betrachten:

{ 
    book: ..., 
    ownerUser: ..., 
    buyerUser: ..., 
    status: 'pending' 
    dateSold: null 
} 

Wenn der Handel zugelassen ist, Sie dieses Dokument zuerst ändern, aktualisieren Sie dann neben alle damit verbundenen Dokumente. Sollte etwas anderes scheitern, würde dieses Dokument entscheiden, ob die Transaktion tatsächlich stattgefunden hat.

+0

Das macht Sinn, danke! – alwayslearning

Verwandte Themen