2012-04-26 70 views
6

Tôi có đối tượng sau trong cơ sở dữ liệu mongo của tôi có tên là âm nhạc.

Tôi muốn cập nhật nơi genre là Grunge
Tên ban nhạc là Niết Bàn
Tên album là Nevermind
Trình tự theo dõi là 1

Cập nhật MongoDB Sâu mảng

và thay đổi tên ca khúc để "Smells Like Teen Spirit ! "
Tôi đã thử chơi với toán tử vị trí, nhưng không thể hoàn toàn tìm hiểu điều này.

{ 
    genre : "Grunge", 
    bands : [ { 
     name : "Nirvana", 
     albums : [ { 
      name : "Nevermind", 
      tracks : [ { 
       name : "Smell Like Teen Spirit", 
       order : 1, 
       duration : 301 
      }, 
      { 
       name : "In Bloom", 
       order : 2, 
       duration : 254             
      } ] 
     }, 
     { 
      name : "In Utero", 
      tracks : [ { 
       name : "Server the Servants", 
       order : 1, 
       duration : 216 
      }, 
      { 
       name : "Scentless Apprentice", 
       order : 2, 
       duration : 254             
      } ] 
     } ] 
    }, 
    { 
     name : "Karma++ : A Nirvina Tribute Band", 
     albums : [ { 
      name : "Nevermind", 
      tracks : [ { 
       name : "Smell Like Teen Spirit", 
       order : 1, 
       duration : 301 
      }, 
      { 
       name : "In Bloom", 
       order : 2, 
       duration : 254             
      } ] 
     }, 
     { 
      name : "In Utero", 
      tracks : [ { 
       name : "Server the Servants", 
       order : 1, 
       duration : 216 
      }, 
      { 
       name : "Scentless Apprentice", 
       order : 2, 
       duration : 254             
      } ] 
     } ] 
    } ] 
} 
+0

Bạn đã cân nhắc thay đổi thiết kế DB của mình một chút chưa? Có lẽ sẽ có ý nghĩa hơn nếu tài liệu của bạn là một 'ban nhạc' với thuộc tính 'thể loại' - và sẽ làm cho truy vấn cụ thể này dễ dàng hơn nhiều. – Russell

+0

Đây chỉ là ví dụ nhanh nhất mà tôi có thể nghĩ đến. Nếu tôi thực sự làm một cơ sở dữ liệu 'âm nhạc', tôi có thể đặt các bài hát làm yếu tố gốc với nghệ sĩ, album và thể loại làm mảng; cho phép những thứ như David Bowie/Queen 'Under Pressure' (2 nghệ sĩ, nhiều album). – JWally

Trả lời

9

Thật không may, hiện tại chỉ có thể sử dụng một vị trí "$" cho mỗi lần cập nhật. Điều này giới hạn bản cập nhật cho một mảng được nhúng, tương tự như ví dụ trong tài liệu: http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator (Từ bài đăng của bạn, có vẻ như bạn đã tìm thấy điều này, nhưng tôi đã bao gồm liên kết vì lợi ích của bất kỳ người dùng nào khác đang đọc bài đăng này .)

Để cập nhật, bạn sẽ phải biết vị trí của hai trong số ba phần sau: Vị trí của dải trong dải "dải", vị trí của album trong mảng album, hoặc vị trí của bản nhạc trong mảng "bản nhạc".

Có một yêu cầu tính năng cho chức năng này và được dự kiến ​​cho phiên bản 2.3.0 (mặc dù điều này có thể thay đổi).
https://jira.mongodb.org/browse/SERVER-831 "Positional hành Matching Nested Mảng"

Tạm thời, bạn sẽ phải biết vị trí của các văn bản dưới ở hai trong số ba mảng:

db.music.update({genre : "Grunge", "bands.name" : "Nirvana"}, {$set:{"bands.$.albums.0.tracks.0.name":"Smells Like Teen Spirit!"}}) 

db.music.update({genre : "Grunge", "bands.0.albums.name" : "Nevermind"}, {$set:{"bands.0.albums.$.tracks.0.name":"Smells Like Teen Spirit!"}}) 

hoặc

db.music.update({genre : "Grunge", "bands.0.albums.0.tracks.order" : 1}, {$set:{"bands.0.albums.0.tracks.$.name":"Smells Like Teen Spirit!"}}) 
+3

Dường như họ đã phá vỡ tính tương thích ngược trong phiên bản 2.6.x. Tôi nhận được "Toán tử vị trí không tìm thấy kết quả cần thiết từ truy vấn" cho ví dụ thứ hai của bạn (mongodb 2.6.4). nó hoạt động tốt trong các phiên bản cũ hơn. – bersam

+3

Đó là một lỗi và họ chấp nhận nó, câu trả lời này không còn hợp lệ trong mongoDB 2.6 https://jira.mongodb.org/browse/SERVER-14886 – bersam

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