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

¿Cómo almacenar resultados de formularios generados dinámicamente en MongoDb?

No almacenaría los resultados como documentos incrustados dentro del form documento, ya que es posible que no sepa a priori cuántas presentaciones esperar. MongoDB limita cada documento a 16 MB, pero en la práctica probablemente desee mantenerse muy por debajo de este umbral.

Dado que sus formularios son variables, pero predeterminados (es decir, cada formulario puede diferir, pero los formularios se definen con anticipación en algún tipo de interfaz de usuario de administración), recomiendo usar dos colecciones:

El primero (llámelo forms ) almacenará datos sobre la composición de cada formulario:qué campos, qué tipos, en qué orden, etc. Puede imaginar que los documentos de esta colección se verían así:

{ _id: ObjectId(...),
  name: "...",
  // other fields, for permissions, URL, etc
  fields: [
    { name: "username",
      type: "text",
      validation: { required: true, min: 1, max: null },
    },
    { name: "email",
      type: "text",
      validation: { required: true, min: 5, max: null, email: true },
    }
  ]
}

Esto le permite construir los formularios dinámicamente (junto con algún código del lado del servidor) según sea necesario para mostrarlos en su aplicación. También brinda información sobre qué son los campos y qué validación se requiere para ellos, que puede usar durante el envío del formulario. Querrá un índice en la URL o cualquier campo que use para determinar qué formulario mostrar al atender solicitudes web.

La segunda colección, submissions o algo así, almacenaría los datos enviados para cada formulario. Los documentos se verían así:

{ _id: ObjectId(...),
  form: ObjectId(...), // the ObjectId of the record in "forms"
                       // that this is a submission on
  // other information here about the submitter:
  // IP address, browser, date and time, etc
  values: {
    username: "dcrosta",
    email: "[email protected]",
    //any other fields here
  }
}

Si necesita poder buscar por pares de campo-valor (o solo valores) en los formularios enviados, una variación de esto utiliza una matriz para los values campo, como:

{ ...
  values: [
    { name: "username", value: "dcrosta" },
    { name: "email", value: "[email protected]" }
  ]
}

A continuación, puede crear un índice en los values campo, y busque como:

// find "dcrosta" as username
db.submissions.find({values: {$elemMatch: {name: "username", value: "dcrosta"}}})

O cree un índice en "valores.valor" y busque como:

// find "dcrosta" as value to any field
db.submissions.find({"values.value": "dcrosta"})