MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment stocker les résultats des formulaires générés dynamiquement dans MongoDb ?

Je ne stockerais pas les résultats sous forme de documents intégrés dans le form document, puisque vous ne savez peut-être pas a priori combien de soumissions attendre. MongoDB limite chaque document à 16 Mo, mais en pratique, vous souhaitez probablement rester bien en dessous de ce seuil.

Étant donné que vos formulaires sont variables, mais prédéterminés (c'est-à-dire que chaque formulaire peut différer, mais les formulaires sont définis à l'avance dans une sorte d'interface utilisateur d'administration), je vous recommande d'utiliser deux collections :

Le premier (appelez-le forms ) stockera des données sur la composition de chaque formulaire :quels champs, quels types, dans quel ordre, etc. Vous pouvez imaginer que les documents de cette collection ressembleraient à ceci :

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

Cela vous permet de construire dynamiquement les formulaires (avec du code côté serveur) selon les besoins pour les afficher dans votre application. Il donne également des informations sur les champs et la validation requise pour eux, que vous pouvez utiliser lors de la soumission du formulaire. Vous voudrez un index sur l'URL ou tout autre champ que vous utilisez pour déterminer le formulaire à afficher lors du traitement des requêtes Web.

La deuxième collection, submissions ou quelque chose, stockerait les données soumises pour chaque formulaire. Les documents ressembleraient à :

{ _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 vous devez être en mesure de rechercher par paires champ-valeur (ou simplement par valeurs) dans les formulaires soumis, une variante utilise un tableau pour les values champ, comme :

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

Vous pouvez alors créer un index sur les values champ, et recherchez comme :

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

Ou créez un index sur "values.value" et recherchez comme :

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