Tôi nghĩ những gì bạn muốn là lệnh $ addToSet - sẽ đẩy một phần tử vào một mảng chỉ khi nó chưa 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"
}
Chạy lại lệnh tương tự và kết quả không thay đổi.
Lưu ý:bạn có thể 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ị ràng buộc và gây ra các chuyển động thường xuyên (tương đối tốn kém) bằng cách cập nhật theo cách này - bạn nên xem tại đây để biết ý tưởng về cách giảm thiểu điều này:
http://www.mongodb.org/display/DOCS/Padding + Factor # PaddingFactor-ManualPadding