sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongodb upsert inbäddat dokument

Jag tror att det du vill ha är kommandot $addToSet - som kommer att skicka ett element till en array endast om det inte redan finns. Jag har förenklat ditt exempel lite för korthetens skull:

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}}})

Och vi får den uppdaterade versionen:

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

Kör samma kommando igen och resultatet är oförändrat.

Notera:du kommer sannolikt att utöka dessa dokument, särskilt om det här fältet är obegränsat och orsakar frekventa (relativt dyra) flyttningar genom att uppdatera på detta sätt - du bör titta här för idéer om hur du kan mildra detta:

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




  1. Använd 'MongoMappingContext#setAutoIndexCreation(boolean)' eller åsidosätt 'MongoConfigurationSupport#autoIndexCreation()' för att vara explicit

  2. Hur man ökar befintligt värde i MongoDB

  3. Anslutning pooling i Spring Boot och mongo db

  4. Redis koncept:I minnet eller DB?