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

Agregar php de datos de mongo

La estructura de datos aquí no es una buena implementación, hay muchos problemas con la forma en que está estructurada y es completamente inadecuada para la agregación. Los principales problemas aquí son:

  • Su estructura en realidad no usa ninguna matriz, ahora mismo no

  • Todos los nombres de clave específicos representan un problema real, y esto se puede evitar.

Como tal, la única forma de atravesar este tipo de estructura es usar JavaScript con mapReduce.

Definición de un mapeador:

var mapper = function () {

  for ( var n in this.versions ) {
    for ( var k in this.versions[n].content ) {
      if (
        ( k != 'confirmed' ) ||
        ( k != 'visited' ) )
          emit(
            {
              type: this.chairtype,
              key: k
            },
            this.versions[n].content[k]
          );
    }
  }

};

Entonces, lo que esto está haciendo es recorrer cada una de las entradas de las versiones y luego también a través de todo el contenido. La clave se emite para cada una de las claves de contenido que desee, así como para la clave "tipo silla". Y el valor es ese valor coincidente.

Y luego un reductor:

var reducer = function (key,values) {

    return ( Array.sum( values ) != 0 ) 
        ? Array.sum( values ) / values.length : 0;

};

Que es solo una forma simple de producir un promedio de todos los valores que ingresan al mapeador con la misma clave.

Entonces, si bien eso debería funcionar bien, lo que debería estar haciendo es cambiar su estructura. Entonces, de hecho, si tuvieras algo como esto:

{
    "_id": ObjectId("52b85dfa32b6249513f15897"),
    "parent": "47de3176-bbc3-44e0-8063-8920ac56fdc8",
    "type": "chair",
    "chairtype": "E",
    "content": [
        { "key": "atkswlntfd", "value": 0, "version": 0 },
        { "key": "auwbsjqzir", "value": 0, "version": 0 },
        { "key": "avqrnjzbgd", "value": 0, "version": 0 }
    ]
}

O generalmente más o menos de esa forma, la operación de agregación se vuelve muy simple:

db.collection.aggregate([
    { "$unwind": "$content" },
    { "$group": {
       "_id": {
           "chairtype": "$chairtype",
           "key": "$content.key"
       },
       "average": { "$avg": "$content.value" }
    }}
])

O cualquier otra variación de esto que se requiera, pero ahora es posible cambiando la estructura.

Entonces, sin que el documento tenga una estructura diferente, necesitará usar mapReduce para hacer esto.