2013-03-28 25 views
41

Czy istnieje sposób na aktualizację wartości w obiekcie?Mongoose, zaktualizuj wartości w tablicy obiektów

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

Powiedzmy, że chcę zaktualizować nazwy i pozycje wartości dla pozycji, gdzie id = 2;

Próbowałem następujących w/mangusta:

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

Problem z tego podejścia jest to, że aktualizuje/ustawia cały obiekt, dlatego w tym przypadku tracę pole id.

Czy istnieje lepszy sposób w mangusty, aby ustawić pewne wartości w tablicy, ale pozostawić inne wartości samodzielnie?

Mam również pytani tylko dla człowieka:

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(). 
}); 

Odpowiedz

72

jesteś blisko; należy użyć notacji kropki w $set to zrobić:

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

Witam, kiedy to zrobię, zasugerowałeś. board.update ({_id: board._id, "users.username": req.user.username}, {$ set: {"users. $. LastViewed": new Date()}}, function (err) { }); Wystąpił błąd: nie może używać części (użytkowników user.username) do przechodzenia przez element ({users: [{username: "nlm", _id: ObjectId ("583c8cc3813daa6c29f69cb0"), status: "zaproszony", rola : "recenzent"}]}). Czy jest coś, co zrobiłem inaczej? – sh977218

+2

Działa to świetnie, dziękuję. Czy istnieje jednak sposób na utworzenie elementu, jeśli nie ma go w tablicy? –

4

Dla każdego dokumentu, operatora aktualizacji $set może set multiple values, więc zamiast wymiany całego obiektu w tablicy items można ustawić name i value pola obiektu indywidualnie.

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

Niesamowite, źle wypróbujemy to jutro. Dzięki wielkie! – lostintranslation

0

W Mongoose może aktualizować wartość tablicy przy użyciu $set wewnątrz kropki (.) zapis do określonej wartości w następujący sposób

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

Czy mógłbyś edytować odpowiedź z wyjaśnieniami lub odnosić się do pytania? –

+0

tak można zaktualizować w mongodb? –

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

Mongodb document

0

W mangusta może aktualizować, jak prosta tablica

user.updateInfoByIndex(0,"test") 

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

Twoja odpowiedź będzie bardziej pomocna z pewnym wyjaśnieniem. Rozważ to edytowanie. –

Powiązane problemy