MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongodb upsert eingebettetes Dokument

Ich denke, was Sie wollen, ist der Befehl $addToSet - der ein Element nur dann in ein Array schiebt, wenn es noch nicht existiert. Ich habe Ihr Beispiel der Kürze halber etwas vereinfacht:

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

Führen Sie nun Folgendes aus:

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

Und wir bekommen die aktualisierte Version:

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

Führen Sie denselben Befehl erneut aus und das Ergebnis ist unverändert.

Hinweis:Sie werden diese Dokumente wahrscheinlich erweitern, insbesondere wenn dieses Feld unbegrenzt ist und durch Aktualisierungen auf diese Weise häufige (relativ teure) Verschiebungen verursacht - Sie sollten hier nach Ideen suchen, wie Sie dies abmildern können:

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