sql >> Base de Datos >  >> NoSQL >> MongoDB

Mongodb upsert documento incrustado

Creo que lo que quiere es el comando $addToSet, que empujará un elemento a una matriz solo si aún no existe. He simplificado un poco tu ejemplo por brevedad:

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

Ahora ejecuta:

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

Y obtenemos la versión actualizada:

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

Vuelva a ejecutar el mismo comando y el resultado no cambiará.

Nota:es probable que haga crecer estos documentos, especialmente si este campo no está delimitado y provoca movimientos frecuentes (relativamente costosos) al actualizar de esta manera; debe consultar aquí para obtener ideas sobre cómo mitigar esto:

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