sql >> Database teknologi >  >> NoSQL >> MongoDB

Mongodb upsert indlejret dokument

Jeg tror, ​​hvad du vil have, er $addToSet-kommandoen - som kun vil skubbe et element til et array, hvis det ikke allerede eksisterer. Jeg har forenklet dit eksempel lidt for kortheds skyld:

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

Kør nu:

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

Og vi får den opdaterede version:

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

Kør den samme kommando igen, og resultatet er uændret.

Bemærk:du vil sandsynligvis vokse disse dokumenter, især hvis dette felt er ubegrænset og forårsager hyppige (relativt dyre) flytninger ved at opdatere på denne måde - du bør se her for ideer til, hvordan du kan afbøde dette:

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




  1. Mongoose find() RegExp for nummertypefelt

  2. Denne node blev ikke startet med replSet-indstillingen

  3. Kort Reducer type forespørgsel med behov for at korrelere med forrige række

  4. Vælg Matching Array Element og Returner valgte felter