2012-04-18 34 views
5

Tôi có tài liệu mỗi ngày trên mỗi mét. Làm thế nào tôi có thể thêm một subdocument khác trong mảng dữ liệu và tạo toàn bộ tài liệu nếu không tồn tại?Mongodb upsert tài liệu nhúng

 
{ 
    "key": "20120418_123456789", 
    "data":[ 
    { 
    "Meter": 123456789, 
    "Dt": ISODate("2011-12-29T16:00:00.0Z"), 
    "Energy": 25, 
    "PMin": 11, 
    "PMax": 16 
    } 
    ], 
    "config": {"someparam": 4.5} 
} 

Tôi có thể sử dụng upsert cho mục đích đó không?

Kết quả sẽ là nếu tài liệu tồn tại:

 
{ 
    "key": "20120418_123456789", 
    "data":[ 
    { 
    "Meter": 123456789, 
    "Dt": ISODate("2011-12-29T16:00:00.0Z"), 
    "Energy": 25, 
    "PMin": 11, 
    "PMax": 16 
    }, 
    { 
    "Meter": 123456789, 
    "Dt": ISODate("2011-12-29T16:15:00.0Z"), 
    "Energy": 22, 
    "PMin": 13, 
    "PMax": 17 
    } 
    ], 
    "config": {"someparam": 4.5} 
} 

Cảm ơn trước

Trả lời

9

Tôi nghĩ rằng những gì bạn muốn là lệnh $ addToSet - đó sẽ đẩy một yếu tố để một mảng duy nhất nếu nó không đã tồn tại. Tôi đã đơn giản hóa ví dụ của bạn một chút cho ngắn gọn:

db.meters.findOne() 
{ 
    "_id" : ObjectId("4f8e95a718bc9c7da1e6511a"), 
    "config" : { 
     "someparam" : 4.5 
    }, 
    "data" : [ 
     { 
      "Meter" : 123456789, 
     } 
    ], 
    "key" : "20120418_123456789" 
} 

Bây giờ chạy:

db.meters.update({"key" : "20120418_123456789"}, {"$addToSet": {"data" : {"Meter" : 1234}}}) 

Và chúng tôi nhận được phiên bản cập nhật:

db.meters.findOne() 
{ 
    "_id" : ObjectId("4f8e95a718bc9c7da1e6511a"), 
    "config" : { 
     "someparam" : 4.5 
    }, 
    "data" : [ 
     { 
      "Meter" : 123456789, 
     }, 
     { 
      "Meter" : 1234 
     } 
    ], 
    "key" : "20120418_123456789" 
} 

Run cùng lệnh một lần nữa và kết quả không thay đổi.

Lưu ý: bạn có khả năng sẽ phát triển các tài liệu này, đặc biệt nếu trường này không bị chặn và gây ra các chuyển động thường xuyên (tương đối đắt) bằng cách cập nhật theo cách này - bạn nên xem xét các ý tưởng về cách giảm thiểu điều này:

http://www.mongodb.org/display/DOCS/Padding+Factor#PaddingFactor-ManualPadding

+0

Tôi sẽ phải làm 400000 addToSet mỗi ngày ... 96 dữ liệu trên mỗi tài liệu. Nó có vẻ chậm ... Có cách nào khác để làm điều đó không? – hotips

+0

như đã đề cập, bạn sẽ kích hoạt nhiều di chuyển bằng cách phát triển một mảng giá trị theo cách đó - điều đó sẽ làm chậm tốc độ, trừ khi bạn giới hạn mảng theo một cách nào đó và có thể dự đoán kích thước tối đa của nó - sau đó bạn có thể đệm nó một cách thích hợp và cập nhật sẽ nhanh hơn rất nhiều. Nếu bạn không thể làm điều đó thì có lẽ bạn nên xem xét một lược đồ khác và có dữ liệu trong một bộ sưu tập khác chứ không phải là một mảng được nhúng. –

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