2012-04-18 18 views
5

Ich habe ein Dokument pro Tag pro Meter. Wie kann ich ein weiteres Filialdokument im Datenarray hinzufügen und das gesamte Dokument erstellen, wenn er nicht existiert?Mongodb upsert eingebettetes Dokument

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

Kann ich upsert für diesen Zweck verwenden?

wird das Ergebnis sein, wenn Dokument vorhanden ist:

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

Vielen Dank im Voraus

Antwort

9

denke ich, was wollen Sie das $ addToSet Befehl ist -, die nur ein Element in ein Array drückt, wenn es nicht der Fall ist existieren bereits.

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

Jetzt laufen:: Ich habe Ihr Beispiel ein bisschen der Kürze halber vereinfacht

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

Und wir erhalten die aktualisierte Version:

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

Führen Sie den gleichen Befehl wieder und das Ergebnis ist unverändert.

Hinweis: Sie werden diese Dokumente wahrscheinlich vergrößern, vor allem, wenn dieses Feld unbegrenzt ist und häufige (relativ teure) Verschiebungen durch Aktualisierung auf diese Weise verursacht - Sie sollten hier nach Ideen suchen, wie Sie dies mildern können:

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

+0

ich werde 400000 addToSet pro Tag tun ... 96 Daten pro Dokument. Es scheint langsam zu sein ... Gibt es andere Möglichkeiten, das zu tun? – hotips

+0

Wie bereits erwähnt, werden Sie mehrere Moves auslösen, indem Sie ein Array von Werten auf diese Art und Weise wachsen lassen - das wird eine Verlangsamung verursachen, wenn Sie das Array nicht irgendwie begrenzen und seine maximale Größe vorhersagen können - dann können Sie es entsprechend anpassen Updates wären viel schneller. Wenn Sie das nicht können, sollten Sie vielleicht ein anderes Schema in Erwägung ziehen und die Daten in einer anderen Sammlung als in einem eingebetteten Array haben. –

Verwandte Themen