2017-01-27 19 views
5

Tôi đang gặp nhóm của mảng của phần tử trong MongoDB như đưa ra dưới đây:Cập nhật phần tử trong mảng nếu tồn tại khác chèn yếu tố mới trong mảng đó trong MongoDB

{ 
    "_id" : 5, 
    "quizzes" : [ 
     { 
      "wk" : 1, 
      "score" : 10 
     }, 
     { 
      "wk" : 2, 
      "score" : 8 
     }, 
     { 
      "wk" : 3, 
      "score" : 5 
     } 
     ], 
    "play" : [ 
     { 
      "wk" : 2, 
      "score" : 8 
     }, 
     { 
      "wk" : 3, 
      "score" : 5 
     } 
    ] 
} 

tôi đang cố gắng chèn kỷ lục mới trong mảng nếu không muốn nói hiện tại và nếu bản ghi có trong mảng đó thì hãy cập nhật bản ghi mảng đó. Dưới đây là truy vấn MongoDB của tôi.

db.push.update(
    { _id: 5 }, 
    { $push: { "quizzes": {"wk" : 6.0,"score" : 8.0},"play": {"wk" : 6.0,"score" : 8.0} } } 
) 

Mỗi khi tôi thực hiện truy vấn này, nó chèn bản ghi mới vào mảng nhưng tôi muốn nếu bản ghi hiện tại sau đó cập nhật mảng đó.

+0

Khi bạn nói * 'nếu kỷ lục hiện nay' *, bạn có nghĩa kỷ lục với cùng 'wk' hoặc cùng' score' hoặc cùng 'tuần '&' điểm số'? –

+0

cùng điểm và điểm số. – 5a01d01P

Trả lời

8

Sử dụng $addToSet thay vì $push.

db.push.update(
    { _id: 5 }, 
    { $addToSet: { "quizzes": {"wk": 6.0, "score": 8.0}, "play": {"wk": 6.0, "score": 8.0} } } 
) 

EDIT:

Không có đơn giản tích hợp trong cách tiếp cận để cập nhật tiểu tài liệu có điều kiện trong một lĩnh vực mảng, bởi tài sản cụ thể. Tuy nhiên, một mẹo nhỏ có thể thực hiện công việc bằng cách thực hiện hai lệnh theo thứ tự.

Ví dụ: Nếu chúng ta muốn cập nhật các lĩnh vực quizzes với đối tượng { "wk": 7.0, "score": 8.0 }, chúng ta có thể làm điều đó trong hai bước:

Bước 1:$pull ra sub-tài liệu từ quizzes mảng nơi "wk": 7.0. (Không có gì xảy ra nếu không tìm thấy tài liệu phụ phù hợp).

db.push.update(
    { _id: 5 }, 
    { $pull: { "quizzes": { "wk": 7.0 } } } 
) 

Bước 2:$addToSet tiểu tài liệu.

db.push.update(
    { _id: 5 }, 
    { $addToSet: { "quizzes": {"wk": 7.0, "score": 8.0} } } 
) 

Bạn có thể kết hợp hai bản cập nhật trên các lệnh bằng cách sử dụng bulk.find().update()

+0

Santanu Biswas .. cảm ơn cho phản ứng của bạn.kết quả cũng cho tôi biết nếu trong mảng "wk" giá trị của tôi là như nhau nhưng nếu "điểm" giá trị được cập nhật sau đó tôi muốn cập nhật giá trị mảng chứ không chèn phần tử mới trong mảng đó. – 5a01d01P

+0

@ user3720965 Tôi tự hỏi tại sao bạn xóa nội dung này là câu trả lời chính xác! –

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