2011-09-15 43 views
9

Tôi có cấu trúc sau đây trong tài liệu của tôi:Làm thế nào để cập nhật giá trị của tài liệu nhúng cụ thể, bên trong một mảng, của một tài liệu cụ thể trong MongoDB?

{ 
    _id : ObjectId("43jh4j343j4j"), 
    array : [ 
      { 
       _arrayId : ObjectId("dsd87dsa9d87s9d7"), 
       someField : "something", 
       someField2 : "something2" 
      }, 
      { 
       _arrayId : ObjectId("sds9a0d9da0d9sa0"), 
       someField : "somethingElse", 
       someField2 : "somethingElse2" 
      } 
    ] 
} 

Tôi muốn cập nhật someFieldsomeField2 nhưng chỉ cho một trong các mục trong mảng, một trong đó phù hợp với _arrayId (ví dụ _arrayId : ObjectId("dsd87dsa9d87s9d7") và chỉ cho tài liệu này (ví dụ: _id : ObjectId("43jh4j343j4j")) và không có tài liệu nào khác.

arrayIds không phải là duy nhất cho tài liệu đó là lý do tôi cần nó cho một tài liệu cụ thể ument. Tôi có thể sử dụng $ positional operator nếu tôi muốn cập nhật giá trị đó trong mảng cho mọi tài liệu tồn tại, nhưng đó không phải là những gì tôi muốn.

Tôi đang cố gắng thực hiện điều này trong nhưng giải pháp dòng lệnh cũng hoạt động.

Trả lời

13

Bạn vẫn có thể sử dụng toán tử $ positional để thực hiện việc này. Nhưng bạn cần phải chỉ định objectid của tài liệu gốc cùng với bộ lọc _arrayid. Dưới đây truy vấn dòng lệnh hoạt động tốt

db.so.update({_id:ObjectId("4e719eb07f1d878c5cf7333c"), 
       "array._arrayId":ObjectId("dsd87dsa9d87s9d7")}, 
       {$set:{"array.$.someField":"updated"}}) 
+0

Các công trình lớn! Cảm ơn. Vì vậy, truy vấn trong 'coll.update (truy vấn, dữ liệu)' hoạt động giống như một bộ lọc để tìm tài liệu bạn đang tìm kiếm, và làm bộ chọn cho phần tài liệu mà bạn quan tâm? – rjgonzo

+0

có chính xác .. vui mừng nó đã giúp .. – RameshVel

17

Dưới đây là giải pháp RameshVel của dịch sang :

DB db = conn.getDB("yourDB"); 
    DBCollection coll = db.getCollection("yourCollection"); 

    ObjectId _id = new ObjectId("4e71b07ff391f2b283be2f95"); 
    ObjectId arrayId = new ObjectId("4e639a918dca838d4575979c"); 

    BasicDBObject query = new BasicDBObject(); 
    query.put("_id", _id); 
    query.put("array._arrayId", arrayId); 

    BasicDBObject data = new BasicDBObject(); 
    data.put("array.$.someField", "updated"); 

    BasicDBObject command = new BasicDBObject(); 
    command.put("$set", data); 

    coll.update(query, command); 
+0

Cảm ơn bạn rất nhiều tôi đã được tìm kiếm một câu trả lời cho giống như hai giờ ... –

+0

Điều gì sẽ xảy ra nếu chúng ta có thêm một cấp mảng bằng cách tạo ra một số mảng trong một mảng? Chúng ta có thể viết một cái gì đó như data.put ("array. $. SomeField. $. AnotherField", "updated"); Không làm việc cho tôi – Manish

+0

Cảm ơn, đã giải quyết được sự cố của tôi. mảng $. trường là lừa (tôi đang sử dụng 3,5) – Gilian

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