2013-03-28 18 views
41

Gibt es eine Möglichkeit, Werte in einem Objekt zu aktualisieren?Mongoose, Werte im Array von Objekten aktualisieren

{ 
    _id: 1, 
    name: 'John Smith', 
    items: [{ 
    id: 1, 
    name: 'item 1', 
    value: 'one' 
    },{ 
    id: 2, 
    name: 'item 2', 
    value: 'two' 
    }] 
} 

Sagen wir, ich möchte den Namen und Wert Elemente für Artikel mit ID = 2;

Ich habe folgend w/Mungo versucht:

var update = {name: 'updated item2', value: 'two updated'}; 
Person.update({'items.id': 2}, {'$set': {'items.$': update}}, function(err) { ... 

Problem mit diesem Ansatz ist, dass es aktualisiert/setzt das gesamte Objekt, also in diesem Fall, dass ich das ID-Feld verlieren.

Gibt es einen besseren Weg in Mungo, bestimmte Werte in einem Array zu setzen, aber andere Werte in Ruhe zu lassen?

Ich habe auch nur für die Person abgefragt:

Person.find({...}, function(err, person) { 
    person.items ..... // I might be able to search through all the items here and find item with id 2 then update the values I want and call person.save(). 
}); 

Antwort

72

Sie sind in der Nähe; Sie sollten Punktnotation in Ihrem $set verwenden zu tun, dass:

Person.update({'items.id': 2}, {'$set': { 
    'items.$.name': 'updated item2', 
    'items.$.value': 'two updated' 
}}, function(err) { ... 
+0

Hallo, wenn ich genau das mache hast du vorgeschlagen. board.update ({_id: board._id, "users.username": req.user.username}, {$ set: {"Benutzer. $. LastViewed": neues Datum()}}, function (err) { }); Ich habe einen Fehler: kann den Teil (Benutzer von users.username) nicht verwenden, um das Element zu durchlaufen ({users: [{Benutzername: "nlm", _id: Objekt-ID ('583c8cc3813daa6c29f69cb0'), Status: "Eingeladen", Rolle : "Rezensent"}]}). Gibt es irgendetwas, was ich anders gemacht habe? – sh977218

+2

Das funktioniert super, danke. Gibt es jedoch eine Möglichkeit, ein Element zu erstellen, wenn es nicht im Array ist? –

4

Für jedes Dokument, der Update Operator $set kann set multiple values, also eher als das gesamte Objekt in dem items Array ersetzen Sie die name und value Felder festlegen des Objekts einzeln.

{'$set': {'items.$.name': update.name , 'items.$.value': update.value}} 
+0

Awesome, krank, versuchen Sie es morgen. Vielen Dank! – lostintranslation

0

In Mungo, können wir Array-Wert unter Verwendung von $set innen Punkt (.) Notation bestimmten Wert in folgenden Weise

db.collection.update({"_id": args._id, "viewData._id": widgetId}, {$set: {"viewData.$.widgetData": widgetDoc.widgetData}}) 
+0

Würden Sie bitte die Antwort mit Erklärungen bearbeiten oder sich auf die Frage beziehen? –

+0

das ist, wie Sie es in Mongodb aktualisieren würden? –

0
model.update({"_id": 1, "items.id": "2"}, 
{$set: {"items.$.name": "yourValue","items.$.value": "yourvalue"}}) 

Mongodb document

0

In Mungo aktualisieren können wir aktualisieren, wie einfaches Array

user.updateInfoByIndex(0,"test") 

User.methods.updateInfoByIndex = function(index, info) ={ 
    this.arrayField[index]=info 
    this.save() 
} 
+1

Ihre Antwort wäre hilfreicher mit einigen Erklärungen. Bitte überlegen Sie, es zu bearbeiten. –

Verwandte Themen