2012-07-07 58 views
40

Tôi đang cố gắng cập nhật một phần phụ được chứa trong một mảng trong tài liệu mongodb. Tôi muốn tham khảo các lĩnh vực bằng cách sử dụng chỉ số mảng của nó (các yếu tố trong mảng không có bất kỳ lĩnh vực mà tôi có thể đảm bảo sẽ được định danh duy nhất). Có vẻ như điều này nên dễ dàng để làm, nhưng tôi không thể tìm ra cú pháp.MongoDB: Làm cách nào để cập nhật một phần tử con trong một mảng, được tham chiếu bởi chỉ mục trong mảng?

Đây là những gì tôi muốn làm trong giả-json.

Trước:

{ 
    _id : ..., 
    other_stuff ... , 
    my_array : [ 
    { ... old content A ... }, 
    { ... old content B ... }, 
    { ... old content C ... } 
    ] 
} 

Sau:

{ 
    _id : ..., 
    other_stuff ... , 
    my_array : [ 
    { ... old content A ... }, 
    { ... NEW content B ... }, 
    { ... old content C ... } 
    ] 
} 

Có vẻ như các truy vấn nên một cái gì đó như thế này:

//pseudocode 
db.my_collection.update(
    {_id: ObjectId(document_id), my_array.1 : 1 }, 
    {my_array.$.content: NEW content B } 
) 

Nhưng điều này không làm việc. Tôi đã dành quá nhiều thời gian để tìm kiếm tài liệu mongodb và thử các biến thể khác nhau về cú pháp này (ví dụ: sử dụng $slice, v.v ...). Tôi không thể tìm thấy bất kỳ lời giải thích rõ ràng về cách thực hiện kiểu cập nhật này trong MongoDB.

Trả lời

51

Như dự kiến, truy vấn dễ dàng khi bạn biết cách thực hiện. Đây là cú pháp, trong python:

db["my_collection"].update(
    { "_id": ObjectId(document_id) }, 
    { "$set": { 'documents.'+str(doc_index)+'.content' : new_content_B}} 
) 
+9

Không .. .. đó là thực sự không rõ. – Moumit

10

Theo kiểu mong muốn, sử dụng toán tử vị trí '$'. Khám phá số này link để biết chi tiết.

db.my_collection.update(
    {_id: ObjectId(document_id), my_array.1 : 1 }, 
    { $set: { "my_array.$.content" : "NEW content B" } } 
) 
19

Cập nhật của một phần tử mảng tham chiếu bởi một chỉ số (ví dụ 1) trong Mongo Shell cũng có thể được thực hiện bằng cách trực tiếp cho thấy giá trị chỉ số:

db.my_collection.update(
    {_id : "document_id"}, 
    {$set : {"my_array.1.content" : "New content B"}} 
) 
0
db.my_collection.update(
    {_id: ObjectId(document_id), my_array : { ... old content A ... } }, 
    { $set: { "my_array.$.content" : "NEW content B" } } 
) 
Các vấn đề liên quan