2016-07-21 10 views
0

Ich bin neu in node.js von Java Erfahrung. Ich habe eine Situation, die ich versuche, meinen Kopf einzuwickeln. Mein Stapel ist express.js, mongoose, ejs template. Hier ist mein Szenario: Ich habe ein Schema:Wie aktualisiert man ein bestimmtes Objekt in einem Array von Objekten in Node.js und Mongoose

var UserSchema = mongoose.Schema({ 
name: { 
    type: String, 
    index: true 
}, 
password: { 
    type: String, 
    select: false 
}, 
email: { 
    type: String 
}, 
academic: [{ 
    qualification: String, 
    institute: String, 
    from: String, 
    to: String, 
    about: String 
}] 

});

gibt es eine Liste von Akademikern. Ich möchte nur ein akademisches Objekt in dieser Liste aktualisieren. Wie würde ich darüber gehen?

router.post('/academic/schools/update', function (req, res) { 

});

Ich übergebe die Werte aus EJS-Vorlage in die Route und die Werte in der req.Body. Wie würde ich in Knoten und Mungo das spezifische Objekt in der Route abfragen und dann seine Werte aktualisieren. Ich habe darüber nachgedacht, dem akademischen Objekt vielleicht eine ID hinzuzufügen, um verfolgen zu können, was ich aktualisieren soll.

+0

verwenden Mongoose sollte automatisch zu jedem Objekt in dem Array Academics ein _id-Feld hinzufügen, da es sie als "Unterdokumente" behandelt. Sie können innerhalb des Akademiker-Arrays mit {'academics._id': _id} usw. abfragen und dann das übereinstimmende Dokument mit dem Positionsoperator {$ set: {'academics. $': YourUpdatedAcademic}} ... weitere Informationen aktualisieren https://docs.mongodb.com/manual/reference/operator/update/positional/ –

+0

Ich verstehe, danke Mann –

Antwort

2

Jedes akademische Unterdokument erhält nach dem Speichern eine _id. Es gibt zwei Möglichkeiten, wie Sie es tun können. Wenn Sie die ID des Benutzers und ID der akademischen Unter-doc-ID in der URL oder Anfrage Körper passieren, dann können Sie wie folgt aktualisiert:

User.findById(userId).then(user => { 
    let academic = user.academic.id(academicId); 
    academic.qualification = 'something'; 
    return user.save(); 
}); 

Wenn Sie nur die ID des akademischen Unter doc geben , dann können Sie es wie folgt tun:

User.findOne({'academic._id': academicId}).then(user => { 
    let academic = user.academic.id(academicId); 
    academic.qualification = 'something'; 
    return user.save(); 
}); 

Beachten Sie, dass Unter Dokument Array Rückkehr von Mungo ist mongoosearray anstelle des nativen Array-Datentypen. Sie können sie also manipulieren, indem Sie .id .push .pop .remove-Methode http://mongoosejs.com/docs/subdocs.html

Verwandte Themen