2015-06-11 35 views
6

Tôi dường như gặp sự cố khi truy cập nội dung của một mảng được lồng trong một mảng trong tài liệu mongodb. Tôi không có vấn đề truy cập vào mảng đầu tiên "nhóm" với một truy vấn như sau ...MongoDB: cập nhật mảng trong mảng

db.orgs.update({_id: org_id, "groups._id": group_id} , {$set: {"groups.$.name": "new_name"}}); 

đâu tôi chạy vào rắc rối là khi tôi cố gắng để thay đổi các thuộc tính của một phần tử trong mảng "tính năng" lồng trong vòng mảng "nhóm".

Đây là những gì một tài liệu ví dụ trông giống như

 { 
     "_id" : "v5y8nggzpja5Pa7YS", 
     "name" : "Example", 
     "display_name" : "EX1", 
     "groups" : [ 
      { 
       "_id" : "s86CbNBdqJnQ5NWaB", 
       "name" : "Group1", 
       "display_name" : "G1", 
       "features" : [ 
        { 
         _id  : "bNQ5Bs8BWqJn6CdNa" 
         type  : "blog", 
         name  : "[blog name]" 
         owner_id : "ga5YgvP5yza7pj8nS" 
        }, 
       ] 
      }, 
     ] 
    }, 

Và đây là câu hỏi tôi đã cố gắng để sử dụng.

db.orgs.update({_id: "v5y8nggzpja5Pa7YS", "groups._id": "qBX3KDrtMeJGvZWXZ", "groups.features._id":"bNQ5Bs8BWqJn6CdNa" }, {$set: {"groups.$.features.$.name":"New Blog Name"}}); 

Nó trả về một thông báo lỗi:

WriteResult({ 
    "nMatched" : 0, 
    "nUpserted" : 0, 
    "nModified" : 0, 
    "writeError" : { 
     "code" : 2, 
     "errmsg" : "Too many positional (i.e. '$') elements found in path 'groups.$.features.$.name'" 
    } 
}) 

Dường như Mongo không hỗ trợ thay đổi mảng lồng nhau trong mảng thông qua các yếu tố vị trí?

Có cách nào để sửa đổi mảng này mà không lấy toàn bộ nội dung, sửa đổi và sau đó đưa nó trở lại? Với nhiều tổ như thế này là nó thực hành tiêu chuẩn để tạo ra một bộ sưu tập mới? (Mặc dù dữ liệu chỉ cần thiết khi dữ liệu gốc là cần thiết) Tôi có nên thay đổi cấu trúc tài liệu sao cho mảng lồng nhau thứ hai là một đối tượng và truy cập nó qua khóa không? (Trong trường hợp khóa là giá trị số nguyên có thể hoạt động dưới dạng "_id")

groups.$.features.[KEY].name 

Cách được coi là "đúng" để thực hiện việc này?

Trả lời

3

Sau một vài nghiên cứu nữa, có vẻ như cách duy nhất để sửa đổi mảng trong một mảng sẽ là với một số logic bên ngoài để tìm chỉ mục của phần tử tôi muốn thay đổi. Làm điều này sẽ yêu cầu mọi thay đổi để có một truy vấn tìm kiếm để xác định vị trí chỉ mục, và sau đó một truy vấn cập nhật để sửa đổi mảng. Điều này dường như không phải là cách tốt nhất.

Link to a 2010 JIRA case requesting multiple positional elements...

Vì tôi sẽ luôn biết ID của tính năng này, tôi đã chọn để sửa đổi cấu trúc tài liệu của tôi.

 { 
    "_id" : "v5y8nggzpja5Pa7YS", 
    "name" : "Example", 
    "display_name" : "EX1", 
    "groups" : [ 
     { 
      "_id" : "s86CbNBdqJnQ5NWaB", 
      "name" : "Group1", 
      "display_name" : "G1", 
      "features" : { 
       "1" : { 
         type  : "blog", 
         name  : "[blog name]" 
         owner_id : "ga5YgvP5yza7pj8nS" 
       }, 
      } 
     }, 
    ] 
}, 

Với cấu trúc mới, những thay đổi có thể được thực hiện theo cách sau đây:

db.orgs.update({_id: "v5y8nggzpja5Pa7YS", "groups._id": "s86CbNBdqJnQ5NWaB"}, {$set: {"groups.$.features.1.name":"Blog Test 1"}}); 
Các vấn đề liên quan