sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur lagrar man resultat från dynamiskt genererade formulär i MongoDb?

Jag skulle inte lagra resultat som inbäddade dokument i form dokument, eftersom du kanske inte känner till a priori hur många inlämningar man kan förvänta sig. MongoDB begränsar varje dokument till 16 MB, men i praktiken vill du förmodligen hålla dig långt under denna tröskel.

Eftersom dina formulär är variabla, men förutbestämda (det vill säga varje form kan skilja sig åt men formulären definieras i förväg i någon form av administratörsgränssnitt), rekommenderar jag att du använder två samlingar:

Den första (kalla den forms). ) kommer att lagra data om sammansättningen av varje formulär:vilka fält, vilka typer, i vilken ordning, etc. Du kan tänka dig att dokument i den här samlingen skulle se ut ungefär så här:

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

Detta låter dig konstruera formulären dynamiskt (tillsammans med viss kod på serversidan) efter behov för visning i din applikation. Den ger också information om vad fälten är och vilken validering som krävs för dem, som du kan använda vid formulärinlämning. Du vill ha ett index över URL eller vilket fält du använder för att avgöra vilket formulär som ska visas när webbförfrågningar visas.

Den andra samlingen, submissions eller något, skulle lagra de inlämnade uppgifterna för varje formulär. Dokument skulle se ut så här:

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

Om du behöver kunna söka efter fält-värdepar (eller bara värden) i de inskickade formulären, använder en variant av detta en array för values fält, som:

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

Du kan sedan skapa ett index på values och sök som:

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

Eller skapa ett index på "values.value" och sök som:

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



  1. ServiceStack.Net Redis:Lagring av relaterade objekt vs. relaterade objekt-ID

  2. Importera CSV-data som en array i MongoDB med mongoimport

  3. skicka nedströmsmeddelande till google ccs med node js

  4. Transparent databasfailover för dina applikationer