2012-02-12 38 views
12

Tôi có một bộ sưu tập với một sơ đồ sau:MongoDB cập nhật các yếu tố cụ thể từ subarray

{ 
    "_id" : 28, 
    "n" : [{ 
     "a" : ObjectId("4ef8466e46b3b8140e000000"), 
     "c" : 28, 
     "p" : [ObjectId("4f00640646b3b88005000003"), ObjectId("4f00640146b3b88005000002"), ObjectId("4f00637d46b3b8cc0e000001"), ObjectId("4f00638046b3b8cc0e000002"), ObjectId("4f00638246b3b8cc0e000003"), ObjectId("4f00631646b3b85002000001"), ObjectId("4f00631846b3b85002000002")], 
     "u" : 26 
    }, { 
     "a" : ObjectId("4ef8466e46b3b8140e000000"), 
     "c" : 10, 
     "p" : [ObjectId("4f00640146b3b88005000002"), ObjectId("4f0063fd46b3b88005000001")], 
     "u" : 26 
    }, { 
     "a" : ObjectId("4ef8467846b3b8780d000001"), 
     "u" : 26, 
     "p" : [ObjectId("4f00637b46b3b8cc0e000000")], 
     "c" : 28 
    }, { 
     "a" : ObjectId("4ef85a3e46b3b84408000000"), 
     "u" : 26, 
     "p" : [ObjectId("4f00631046b3b85002000000")], 
     "c" : 28 
    }] 
} 

Tôi cần cập nhật một trong những yếu tố trong mảng trong tài liệu với _id = 28 nhưng chỉ khi một = một số giá trị và c = một số giá trị

db.coll.update({ 
'_id' : 28, 
'n.a' : new ObjectId('4ef85a3e46b3b84408000000'), 
'n.c' : 28 
}, 
{ 
    $push : { 
    'n.$.p' : ObjectId("4b97e62bf1d8c7152c9ccb74") 
    }, 
    $set : { 
    'n.$.t' : ISODate("2013-05-13T14:22:46.777Z") 
    } 
}) 

vì vậy, về cơ bản tôi muốn cập nhật các yếu tố cụ thể từ các mảng: và như xa như người ta có thể thấy, đây là yếu tố thứ tư. Vấn đề là khi truy vấn đang thực hiện, nó có khả năng cập nhật phần tử đầu tiên.

Làm cách nào để khắc phục sự cố?

Trả lời

23

Sự cố trong mã của bạn là dot-notation vì khi bạn chỉ định ký hiệu dấu chấm, bạn cho rằng tiêu chí bộ lọc được chỉ định phải khớp với phần tử mảng đơn đáp ứng tất cả các tiêu chí. Nhưng nó không. Ký hiệu dấu chấm trên mảng có thể lấy bất kỳ phần tử mảng nào nếu có bất kỳ tiêu chí nào phù hợp. Đó là lý do tại sao bạn nhận được bản cập nhật bất ngờ.

Bạn phải sử dụng $elemMatch để khớp với tất cả các bộ lọc trong phần tử array.

db.coll.update({ 
'_id' : 28, 
n: { 
    $elemMatch:{ 
     a : new ObjectId('4ef85a3e46b3b84408000000'), 
     c : 28 } 
    } 
}, 
{ 
    $push : { 
    'n.$.p' : ObjectId("4b97e62bf1d8c7152c9ccb74") 
    }, 
    $set : { 
    'n.$.t' : ISODate("2013-05-13T14:22:46.777Z") 
    } 
}) 

và đầu ra là

{ 
     "a" : ObjectId("4ef85a3e46b3b84408000000"), 
     "c" : 28, 
     "p" : [ 
      ObjectId("4f00631046b3b85002000000"), 
      ObjectId("4b97e62bf1d8c7152c9ccb74") 
     ], 
     "t" : ISODate("2013-05-13T14:22:46.777Z"), 
     "u" : 26 
    } 
Các vấn đề liên quan