2017-12-31 121 views
1

Ich habe ein Modell in Mongoose erstellt:schieben JSON-Dokument in Subdokument Einsätzen ObjectId nur

var userWalletSchema = new Schema({ 
    userid: {type: Schema.ObjectId, ref: 'users'}, 
    Transactions: [{ 
     Datum: {Type: Date}, 
     CODE: {Type: String}, 
     aantal: {Type: Number}, 
     soortTransactie: {Type: String}, 
     bedrag: {Type:Number} 
    }] 
}, 
{collection:'userWallet'}); 

I fügen Sie das folgende Dokument:

var newRecord = { Datum: '2017-12-21T00:00:00+01:00', 
CODE: 'IE00B3VWN518', 
aantal: 48, 
soortTransactie: 'Aankoop', 
bedrag: 478 }; 

Mit diesem Code:

UserWallet.findOneAndUpdate(
    { userid: mongoose.Types.ObjectId(req.user.id)}, 
    { $push: {Transactions: newRecord}}, 
    { upsert: false }, 
    function (err, model) { 
     console.log(err); 
     console.log(model); 
    }); 

Ich habe mehrere Permutationen und Optionen ausprobiert, aber alle geben das gleiche Ergebnis: Ein Datensatz wird in den Transactions-Array geschoben, aber es enthält immer den Wert _id: ObjectId ('5a490c3376dfb6630464f6e1') (Id ändert natürlich), aber nie das Dokument, das ich einfügen wollte.

Was läuft hier falsch? Ich würde erwarten, dass das Einfügen eines neuen Filialdokuments einfach wäre.

Lösung: Ich habe das Problem gefunden. Ich tippte "Type" mit einem Großbuchstaben T und das Wort sollte in JavaScript alles Kleinbuchstaben sein. So albern, hat mich 2 Tage gebraucht, um es zu entdecken.

Antwort

1

Sie können einen anderen Ansatz versuchen. Suchen Sie zuerst das Objekt, fügen Sie dem Objekt die neue Transaktion hinzu und speichern Sie es.

+0

lesen Dies ist eine mehr einfache alte Javascript-Ansatz ist das? Nichts falsch daran, ich werde es versuchen und sehen, ob das für mich funktioniert! –

+0

Nicht alt JavaScript, ich denke, es ist ein mehr Mongoose Ansatz. Sie konnten dies nicht mit dem offiziellen MongoDB-Client tun. –

+0

Danke, ich habe es gefunden. Der ursprüngliche Code funktioniert, aber die Schemadefinition enthielt einen Fehler: Geben Sie den Großbuchstaben T. –

1

Ihr Ansatz in Bezug auf das Speichern ist in Ordnung. Wenn Sie Ihr Schema überprüfen, ist das, was Sie speichern, eine ObjectId und nicht unbedingt ein tatsächliches Objekt.

Wenn Sie stattdessen Objekte vom Typ Benutzer speichern möchten, können Sie das tatsächliche Benutzermodell in Ihre UserWallet-Schema-Deklaration einfügen.

Der Ansatz, den ich für Ihre Situation empfehlen würde, ist jedoch, die Dinge so zu halten, wie sie sind, und beim Abrufen von UserWallets zu verwenden.

Beispiel:

UserWallet.find().populate('user_id').exec(function(err,userWallets){ 

}); 

Nun ist der user_id Bereich UserWallet das tatsächliche Benutzerobjekt hat, die mit dem ObjectId referenziert wird. Sie können mehr über die Bevölkerung in der documentation

+0

Danke Asyene, danke für Ihre Hilfe. Ich habe noch nicht versucht zu bevölkern. Ich denke, ich muss das Feld userid in find() setzen und das Dokument in Ihrem Beispiel ausfüllen? Ich suche das Dokument mit einer bestimmten Benutzer-ID und möchte in diesem Fall ein neues Dokument für das Array erstellen. –

+0

Ja, Sie sollten die user_id, nach der Sie suchen, in die Suchfunktion als Schlüssel/Wert-Paar setzen. Füllen Sie dann auch das Feld user_id Ihrer Ergebnisse aus. Auf diese Weise können Sie UserWallet.user_id.username, UserWallet.user_id.id, UserWallet.user_id.email, etc .. –

+0

Danke, ich habe es gefunden. Der ursprüngliche Code funktioniert, aber die Schemadefinition enthielt einen Fehler: Typ mit dem Großbuchstaben T. –

Verwandte Themen