MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да съхранявам резултати от динамично генерирани формуляри в MongoDb?

Не бих съхранявал резултатите като вградени документи във form документ, тъй като може да не знаете a priori колко подавания да очаквате. MongoDB ограничава всеки документ до 16MB, но на практика вероятно ще искате да останете доста под този праг.

Тъй като вашите формуляри са променливи, но предварително определени (тоест всеки формуляр може да се различава, но формулярите се дефинират предварително в някакъв вид администраторски потребителски интерфейс), бих препоръчал да използвате две колекции:

Първият (наречете го forms ) ще съхранява данни за състава на всеки формуляр:какви полета, какви типове, в какъв ред и т.н. Можете да си представите, че документите в тази колекция ще изглеждат по следния начин:

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

Това ви позволява да конструирате формулярите динамично (заедно с някакъв код от страна на сървъра), както е необходимо за показване във вашето приложение. Той също така дава информация за това какви са полетата и каква проверка се изисква за тях, която можете да използвате по време на подаване на формуляр. Ще искате индекс на URL адрес или каквото и да е поле, което използвате, за да определите кой формуляр да се показва при обслужване на уеб заявки.

Втората колекция, submissions или нещо подобно, ще съхранява изпратените данни за всеки формуляр. Документите ще изглеждат така:

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

Ако трябва да можете да търсите по двойки поле-стойност (или просто стойности) в изпратените формуляри, вариант на това използва масив за values поле, като:

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

След това можете да създадете индекс за values поле и търсете като:

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

Или създайте индекс на „values.value“ и търсете като:

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



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB - различен със заявка не използва индекси

  2. Обновяване/поправяне на Mongoose?

  3. Създаване на тестови данни за MongoDB

  4. NoSQL (MongoDB) срещу Lucene (или Solr) като ваша база данни

  5. Как да използвам MongoDB транзакция с Mongoose?