MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come archiviare i risultati dei moduli generati dinamicamente in MongoDb?

Non memorizzerei i risultati come documenti incorporati all'interno del form documento, poiché potresti non conoscerlo a priori quanti invii aspettarsi. MongoDB limita ogni documento a 16 MB, ma in pratica probabilmente vorrai rimanere ben al di sotto di questa soglia.

Poiché i tuoi moduli sono variabili, ma predeterminati (ovvero, ogni modulo può differire ma i moduli sono definiti in anticipo in una sorta di interfaccia utente di amministrazione), ti consiglio di utilizzare due raccolte:

Il primo (chiamalo forms ) memorizzerà i dati sulla composizione di ogni modulo:quali campi, quali tipi, in quale ordine, ecc. Puoi immaginare che i documenti in questa raccolta assomiglierebbero a questo:

{ _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 },
    }
  ]
}

Ciò ti consente di costruire i moduli in modo dinamico (insieme a del codice lato server) secondo necessità per la visualizzazione nell'applicazione. Fornisce inoltre informazioni su quali sono i campi e quale convalida è richiesta per essi, che puoi utilizzare durante l'invio del modulo. Avrai bisogno di un indice sull'URL o su qualsiasi campo che utilizzi per determinare quale modulo visualizzare quando servi le richieste web.

La seconda raccolta, submissions o qualcosa del genere, memorizzerebbe i dati inviati per ogni modulo. I documenti sarebbero simili a:

{ _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
  }
}

Se devi essere in grado di cercare per coppie campo-valore (o solo valori) nei moduli inviati, una variazione su questo utilizza un array per i values campo, come:

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

Puoi quindi creare un indice sui values campo e cerca come:

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

Oppure crea un indice su "values.value" e cerca come:

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