MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Documento incorporado de upsert do Mongodb


Eu acho que o que você quer é o comando $ addToSet - que enviará um elemento para uma matriz apenas se ele ainda não existir. Eu simplifiquei seu exemplo um pouco por brevidade:
db.meters.findOne()
{
    "_id" : ObjectId("4f8e95a718bc9c7da1e6511a"),
    "config" : {
        "someparam" : 4.5
    },
    "data" : [
        {
            "Meter" : 123456789,
        }
    ],
    "key" : "20120418_123456789"
}

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

E temos a versão atualizada:
db.meters.findOne()
{
    "_id" : ObjectId("4f8e95a718bc9c7da1e6511a"),
    "config" : {
        "someparam" : 4.5
    },
    "data" : [
        {
            "Meter" : 123456789,
        },
        {
            "Meter" : 1234
        }
    ],
    "key" : "20120418_123456789"
}

Execute o mesmo comando novamente e o resultado não será alterado.

Nota:você provavelmente aumentará esses documentos, especialmente se esse campo for ilimitado e causar movimentos frequentes (relativamente caros) atualizando dessa maneira - você deve dar uma olhada aqui para obter ideias sobre como mitigar isso:

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