2014-06-11 14 views
7

Tôi có một tài liệu trong bộ sưu tập MongoDB như thế này:Cập nhật một mục trong một mảng đó là trong một mảng

{ 
    sessions : [ 
     { 
      issues : [ 
       { 
        id : "6e184c73-2926-46e9-a6fd-357b55986a28", 
        text : "some text" 
       }, 
       { 
        id : "588f4547-3169-4c39-ab94-8c77a02a1774", 
        text : "other text" 
       } 
      ] 
     } 
    ] 
} 

Và tôi muốn cập nhật vấn đề này với id 588f4547-3169-4c39-ab94 -8c77a02a1774 trong phiên đầu tiên.

Vấn đề là tôi chỉ biết rằng đó là phiên đầu tiên và id vấn đề

Vì vậy, tôi cố gắng một cái gì đó như thế này (KHÔNG chỉ số về vấn đề này!):

db.mycollection.update({ "sessions.0.issues.id" : "588f4547-3169-4c39-ab94-8c77a02a1774"}, 
         { $set: { "sessions.0.issues.$.text" : "a new text" }}) 

Nhưng tôi có kết quả sau:

WriteResult({ 
    "nMatched" : 0, 
    "nUpserted" : 0, 
    "nModified" : 0, 
    "writeError" : { 
     "code" : 16837, 
     "errmsg" : "The positional operator did not find the match needed from the query. Unexpanded update: sessions.0.issues.$.text" 
    } 

Tôi làm cách nào để thực hiện việc này?

Cảm ơn bạn đã trợ giúp.

+0

tôi không nghĩ rằng "sessions.0.issues.Id" sẽ hoạt động vì các vấn đề lại là một mảng – Sikorski

+0

Nó hoạt động khi tôi tìm kiếm, nó trả về tài liệu. –

Trả lời

9

Bạn phải sử dụng này (hình như tương đương) truy vấn:

db.mycollection.update({"sessions.0.issues": {$elemMatch: {id: <yourValue>}}}, {$set: {"sessions.0.issues.$.text": "newText"}}) 

Chú ý rằng biểu hiện cập nhật của bạn là đúng.

Thông tin thêm về $elemMatch.

Btw, MongoDB reference giải thích rằng toán tử $ không hoạt động "với truy vấn đi qua mảng lồng nhau".

Quan trọng: $elemMatch chỉ hoạt động với phiên bản 4 trở lên.

+0

Nó hoạt động! Tôi đã thử nhiều kết hợp với '$ elemMatch' nhưng không ai làm việc. Cảm ơn bạn –

+0

Cảm ơn @dgiugg, tôi đã học được điều mới – Smart003

+0

Hi @dgiugg Điều gì xảy ra nếu tài liệu có id đã cho không tồn tại? Tôi đang điền phương thức update() với 'upsert = True' nhưng nó không giúp tạo tài liệu mới ... – Desprit

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