2012-04-18 28 views
5

Tengo un documento por día por metro. ¿Cómo puedo agregar otro subdocumento en la matriz de datos y crear todo el documento si no existe?Mongodb upsert documento incrustado

 
{ 
    "key": "20120418_123456789", 
    "data":[ 
    { 
    "Meter": 123456789, 
    "Dt": ISODate("2011-12-29T16:00:00.0Z"), 
    "Energy": 25, 
    "PMin": 11, 
    "PMax": 16 
    } 
    ], 
    "config": {"someparam": 4.5} 
} 

¿Puedo usar upsert para ese propósito?

El resultado será si existe documento:

 
{ 
    "key": "20120418_123456789", 
    "data":[ 
    { 
    "Meter": 123456789, 
    "Dt": ISODate("2011-12-29T16:00:00.0Z"), 
    "Energy": 25, 
    "PMin": 11, 
    "PMax": 16 
    }, 
    { 
    "Meter": 123456789, 
    "Dt": ISODate("2011-12-29T16:15:00.0Z"), 
    "Energy": 22, 
    "PMin": 13, 
    "PMax": 17 
    } 
    ], 
    "config": {"someparam": 4.5} 
} 

Gracias de antemano

Respuesta

9

Creo que lo que quiere es el comando $ addToSet - que empujará a un elemento de un array sólo si no lo hace ya existe. He simplificado el ejemplo un poco por razones de brevedad:

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

Ahora ejecute:

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

ejecutar el mismo comando de nuevo y el resultado no ha cambiado

Nota: es probable que vaya a aumentar estos documentos, especialmente si este campo no tiene límites y ocasiona movimientos frecuentes (relativamente caros) al actualizar de esta manera: aquí debe buscar ideas sobre cómo mitigar esto:

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

+0

voy a tener que hacer 400000 addToSet por día ... 96 datos por documento. Parece ser lento ... ¿Hay otras formas de hacerlo? – hotips

+0

como se mencionó, va a desencadenar varios movimientos al hacer crecer una matriz de valores de esa manera, lo que provocará una desaceleración, a menos que vincule la matriz de alguna manera y pueda predecir su tamaño máximo, luego puede rellenarla adecuadamente y las actualizaciones serían mucho más rápidas. Si no puede hacer eso, quizás debería considerar un esquema diferente y tener los datos en otra colección en lugar de como una matriz incrustada. –

Cuestiones relacionadas