2016-07-29 3 views
1

speichern Wenn ich ein Dokument darstellt, einen Beitrag mit Kommentaren haben, die wie folgt aussieht:MongoDB: Finden Sie die erzeugte ID des inserierten Kind auf Mutter

{ 
    "_id": "579a2a71f7b5455c28a7abcb", 
    "title": "post 1", 
    "link": "www.link1.com", 
    "__v": 0, 
    "comments": [ 
     { 
     "author": "Andy", 
     "body": "Wish I had thought of that", 
     "_id": "579a2a71f7b5455c28a7abcd", 
     "upvotes": 0 
     }, 
     { 
     "author": "Jim", 
     "body": "Just a comment", 
     "_id": "579a2a71f7b5455c28a7abcc", 
     "upvotes": 0 
     } 
    ], 
    "upvotes": 5 
    } 

In der Berufung (Javascript-Code), füge ich eine neue Kommentar, indem Sie auf die post.comments-Array drücken, dann speichern Sie die Post mit .save mit einem Rückruf. Beim Speichern Rückruf möchte ich die generierte _id des neuen Kommentars, die ich gerade gespeichert habe, erhalten. Wie mache ich das?

Ich habe natürlich das Elternpostdokument im Rückruf, aber das ist nicht nützlich, da ich nicht sagen kann, Kommentar wurde gerade eingefügt.

Gibt es ein anderes Dokument Methode oder eine alternative Form des .save Rückruf mit meiner Situation umgehen?

Oder muss ich einfach dem folgen, was ich normalerweise tun würde, und vor dem Speichern eine eindeutige ID auf dem Kommentar generieren?

EDITED: Ich benutze Mungo, Entschuldigung, vergessen zu sagen!

Antwort

1

Sie haben es nicht ausdrücklich gesagt, aber ich nehme an, dass Sie Mongoose verwenden, da Standard-MongoDB den Filialdokumenten keine _id-Eigenschaft hinzufügt.

Wie in der Mongoose Dokumentation erwähnt adding sub-documents in Bezug auf, können Sie das folgende Codebeispiel verwenden:

var Parent = mongoose.model('Parent'); 
var parent = new Parent; 

// create a comment 
parent.children.push({ name: 'Liesl' }); 
var subdoc = parent.children[0]; 
console.log(subdoc) // { _id: '501d86090d371bab2c0341c5', name: 'Liesl' } 
subdoc.isNew; // true 

parent.save(function (err) { 
    if (err) return handleError(err) 
    console.log('Success!'); 
}); 

Statt parent.children[0] Sie haben parent.children[parent.children.length - 1] zu verwenden, um das eingefügte Element zuzugreifen, though.

+0

Ich werde die Mungo-Dokumente lesen, wie vorgeschlagen. Ich habe alle klassischen Multi-User-Probleme ... also möchte ich die Details überprüfen. – kpollock

+0

Okay, das sieht gut aus, die automatisch generierte ID wird * vor * gesetzt, das neue Subdoc kommt von save() zurück, also ist es in Ordnung mit Multi-User und entspricht dem manuellen Hinzufügen einer eindeutigen ID mit Types.ObjectID(). Süss! – kpollock

1

Ich würde davon ausgehen, das Element, das Sie auf dem Array geschoben würde die letzte sein, aber das wäre in einem Multi-User-System nicht funktionieren.

Sie können auch einen Vergleich mit den Feldern "Autor" und "Kommentar" erstellen, obwohl dies eine Menge Ärger zu sein scheint, und mit nur dem Autor und dem Kommentartext können Sie sich nicht sicher sein.

Schließlich können Sie auch die Objekt-ID erstellen und sie dem Kommentar zuweisen und dann speichern. Sie tun das so:

var mongoose = require('mongoose'); 
var id = mongoose.Types.ObjectId(); 

Das ist, was ich tun würde.

+0

Ja, es ist ein klassischer Multi-User-Fehler, dem ich glücklicherweise immer persönlich ausweichen konnte (aber im Laufe der Jahre VIELE MACHT). Danke für das Heads-Up der Funktion Types.ObjectId() !! – kpollock

Verwandte Themen