2012-04-18 18 views
5

Mam dokument dziennie na metr. Jak dodać kolejny dokument podrzędny do tablicy danych i utworzyć cały dokument, jeśli nie istnieje?Mongodb upsert embedded document

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

Czy mogę użyć upsert w tym celu?

Wynik będzie, jeśli dokument istnieje:

 
{ 
    "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} 
} 

góry dzięki

Odpowiedz

9

myślę, co chcesz, to komenda $ addToSet - że będzie apelować element do tablicy tylko wtedy, gdy nie ma już istnieje. Mam uproszczone Twój przykład trochę 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" 
} 

Run to samo polecenie ponownie i wynik pozostaje niezmieniony.

Uwaga: prawdopodobnie będziesz powiększać te dokumenty, szczególnie jeśli to pole jest nieograniczone i powoduje częste (stosunkowo kosztowne) ruchy poprzez aktualizację w ten sposób - powinieneś rzucić okiem na pomysły, jak złagodzić to:

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

+0

będę musiał zrobić 400000 addToSet dziennie ... 96 dane na dokumencie. Wydaje się być powolny ... Czy istnieją inne sposoby, aby to zrobić? – hotips

+0

jak już wspomniano, będziesz wywoływał wiele ruchów, zwiększając w ten sposób tablicę wartości - która spowoduje spowolnienie, chyba że w jakiś sposób związasz tablicę i możesz przewidzieć jej maksymalny rozmiar - wtedy możesz ją odpowiednio umieścić i aktualizacje byłyby znacznie szybsze. Jeśli nie możesz tego zrobić, być może powinieneś rozważyć inny schemat i mieć dane w innej kolekcji, a nie jako osadzoną tablicę. –