2013-03-28 80 views
41

Có cách nào để cập nhật giá trị trong một đối tượng không?Mongoose, cập nhật giá trị trong mảng đối tượng

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

Cho phép nói rằng tôi muốn cập nhật tên và mục giá trị cho mục có id = 2;

Tôi đã thử những điều sau w/mongoose:

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

Vấn đề với cách tiếp cận này là nó cập nhật/bộ toàn bộ đối tượng, do đó trong trường hợp này tôi đã làm mất các trường id.

Có cách nào tốt hơn trong mongoose để đặt các giá trị nhất định trong một mảng nhưng chỉ để lại các giá trị khác không?

Tôi cũng đã truy vấn cho chỉ là Person:

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

Trả lời

72

Bạn đang gần; bạn nên sử dụng ký hiệu dấu chấm trong $set của bạn để làm điều đó:

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

Xin chào, khi tôi thực hiện chính xác bạn đã đề xuất. board.update ({_id: board._id, "user.username": req.user.username}, {$ set: {"người dùng. $. LastViewed": new Date()}}, function (err) { }); Tôi gặp lỗi: không thể sử dụng phần (người dùng tên người dùng.us) để duyệt qua phần tử ({users: [{username: "nlm", _id: ObjectId ('583c8cc3813daa6c29f69cb0'), trạng thái: "được mời", vai trò : "người đánh giá"}]}). Tôi có làm gì khác không? – sh977218

+2

Điều này hoạt động tuyệt vời, cảm ơn bạn. Tuy nhiên, có cách nào để tạo một mục nếu nó không nằm trong mảng không? –

4

Đối với mỗi tài liệu, các nhà điều hành cập nhật $set thể set multiple values, vì vậy hơn là thay thế toàn bộ đối tượng trong mảng items, bạn có thể thiết lập các namevalue lĩnh vực của đối tượng riêng lẻ.

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

Tuyệt vời, bạn hãy thử điều đó vào ngày mai. Cám ơn rất nhiều! – lostintranslation

0

Trong Mongoose, chúng tôi có thể cập nhật giá trị mảng sử dụng $set bên trong dấu chấm (.) ký hiệu giá trị cụ thể trong sau cách

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

Bạn có vui lòng chỉnh sửa câu trả lời với các giải thích hoặc liên quan đến câu hỏi không? –

+0

đây là cách bạn sẽ cập nhật nó trong mongodb? –

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

Mongodb document

0

Trong mongoose chúng tôi có thể cập nhật, giống như mảng đơn giản

user.updateInfoByIndex(0,"test") 

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

Câu trả lời của bạn sẽ hữu ích hơn với một số giải thích. Hãy xem xét chỉnh sửa nó. –

Các vấn đề liên quan