MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie speichert man Ergebnisse aus dynamisch generierten Formularen in MongoDb?

Ich würde Ergebnisse nicht als eingebettete Dokumente im form speichern Dokument, da Sie es vielleicht a priori nicht wissen wie viele Einsendungen zu erwarten sind. MongoDB begrenzt jedes Dokument auf 16 MB, aber in der Praxis möchten Sie wahrscheinlich deutlich unter diesem Schwellenwert bleiben.

Da Ihre Formulare variabel, aber vorbestimmt sind (das heißt, jedes Formular kann sich unterscheiden, aber die Formulare werden im Voraus in einer Art Admin-Benutzeroberfläche definiert), würde ich empfehlen, zwei Sammlungen zu verwenden:

Die erste (nennen wir sie forms ) speichert Daten über den Aufbau jedes Formulars:welche Felder, welche Typen, in welcher Reihenfolge usw. Sie können sich vorstellen, dass Dokumente in dieser Sammlung etwa so aussehen:

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

Auf diese Weise können Sie die Formulare dynamisch (zusammen mit etwas serverseitigem Code) nach Bedarf für die Anzeige in Ihrer Anwendung erstellen. Es enthält auch Informationen darüber, was die Felder sind und welche Validierung für sie erforderlich ist, die Sie während der Formularübermittlung verwenden können. Sie benötigen einen Index für die URL oder ein anderes Feld, das Sie verwenden, um zu bestimmen, welches Formular angezeigt werden soll, wenn Webanfragen bedient werden.

Die zweite Sammlung, submissions oder so, würde die übermittelten Daten für jedes Formular speichern. Dokumente würden wie folgt aussehen:

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

Wenn Sie in den übermittelten Formularen nach Feld-Wert-Paaren (oder nur Werten) suchen müssen, verwendet eine Variation davon ein Array für die values Feld, wie:

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

Sie können dann einen Index für die values erstellen Feld und suchen Sie wie folgt:

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

Oder erstellen Sie einen Index für "values.value" und suchen Sie wie folgt:

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