Myślę, że to, czego potrzebujesz, to polecenie $addToSet - które wypchnie element do tablicy tylko wtedy, gdy jeszcze nie istnieje. Uprościłem nieco twój przykład dla zwięzłości:
db.meters.findOne()
{
"_id" : ObjectId("4f8e95a718bc9c7da1e6511a"),
"config" : {
"someparam" : 4.5
},
"data" : [
{
"Meter" : 123456789,
}
],
"key" : "20120418_123456789"
}
Teraz uruchom:
db.meters.update({"key" : "20120418_123456789"}, {"$addToSet": {"data" : {"Meter" : 1234}}})
I otrzymujemy zaktualizowaną wersję:
db.meters.findOne()
{
"_id" : ObjectId("4f8e95a718bc9c7da1e6511a"),
"config" : {
"someparam" : 4.5
},
"data" : [
{
"Meter" : 123456789,
},
{
"Meter" : 1234
}
],
"key" : "20120418_123456789"
}
Uruchom ponownie to samo polecenie, a wynik pozostanie niezmieniony.
Uwaga:prawdopodobnie będziesz rozwijać te dokumenty, zwłaszcza jeśli to pole jest nieograniczone i powoduje częste (stosunkowo drogie) ruchy poprzez aktualizację w ten sposób - powinieneś zajrzeć tutaj, aby znaleźć pomysły, jak to złagodzić:
http://www.mongodb.org/display/DOCS/Padding +Factor#PaddingFactor-ManualPadding