2012-05-05 14 views
8

Tôi có tài liệu nhưCập nhật nhúng đối tượng bên trong mảng bên trong mảng trong MongoDB

{ 
    id : 100, 
    heros:[ 
     { 
      nickname : "test", 
      spells : [ 
      {spell_id : 61, level : 1}, 
      {spell_id : 1, level : 2} 
      ] 
     } 
    ] 
} 

tôi không thể $set chính tả của level : 3 với spell_id : 1 bên spells rằng bên heros với biệt danh "thử nghiệm tôi đã cố gắng truy vấn này:.

db.test.update({"heros.nickname":"test", "heros.spells.spell_id":1}, 
{$set:{"heros.spells.$.level":3}}); 

Errror tôi thấy là

không thể nối thêm vào mảng bằng cách sử dụng tên trường chuỗi [phép thuật] Cảm ơn bạn đã trợ giúp.

Trả lời

9

Bạn chỉ có thể sử dụng toán tử vị trí $ cho các mảng một cấp. Trong trường hợp của bạn, bạn có một mảng lồng nhau (heros là một mảng, và trong đó mỗi anh hùng có một mảng spells).

Nếu bạn biết các chỉ số của mảng, bạn có thể sử dụng chỉ số rõ ràng khi thực hiện một bản cập nhật, như:

> db.test.update({"heros.nickname":"test", "heros.spells.spell_id":1}, {$set:{"heros.0.spells.1.level":3}}); 
+0

Vâng tôi đã làm như bạn nói –

+0

Cảm ơn dcrosta !!! –

1

Hãy thử một cái gì đó như thế này:

db.test.find({"heros.nickname":"test"}).forEach(function(x) { 
    bool match = false; 
    for (i=0 ; i< x.heros[0].spells.length ; i++) { 
     if (x.heros[0].spells[i].spell_id == 1) 
     { 
      x.heros[0].spells[i].level = 3; 
      match = true; 
     } 
    } 
    if (match === true) db.test.update({ id: x.id }, x); 
}); 

Rõ ràng ai đó đã mở một vé để thêm khả năng đặt một chức năng bên trong mệnh đề cập nhật, nhưng nó đã không được giải quyết chưa: https://jira.mongodb.org/browse/SERVER-458

+0

Mã của bạn không hoạt động. Tôi nghĩ rằng trong x sẽ là tất cả các tài liệu phải không? –

+0

@DenisErmolin oops ... yeah, đó là sai. Tôi chụp một bức ảnh khác (xem bản cập nhật). ** x ** là tài liệu, đúng vậy, vì vậy tôi nghĩ bạn sẽ có thể cập nhật nó bằng thuộc tính ** id **. – McGarnagle

+0

x.spells tham chiếu đến phép thuật nhưng phép thuật trong mảng heros –