当前位置:  开发笔记 > 编程语言 > 正文

如何在MongoDb中存储动态生成的表单的结果?

如何解决《如何在MongoDb中存储动态生成的表单的结果?》经验,为你挑选了1个好方法。

我是MongoDB的新手,但我正在考虑解决这个问题:

我的应用程序有一个动态表单构建器,允许用户创建自定义调查,联系表单等.我想记录所有表单提交,并让创建表单的用户搜索并导出他们提交的数据.

我来自典型的PHP/mySql背景,并且看到将这些数据存储在mySql数据库中的一些挑战.每个表单可以包含任意数量的所有类型的字段.我要么需要将我的数据库规范化为EAV结构来存储数据,要么为每个表单动态创建一个新表,或者将表单数据序列化为TEXT列(ick).

MongoDb的"无架构"(或"动态架构")性质似乎是我问题的完美解决方案,但是我的n00b-iness让我不确定从哪里开始.

    每个自定义表单的结果是否应存储为单独的集合?

    我应该有一个"表单"集合,并将结果作为每个表单的子文档嵌入?

    还有另一种更好的方法吗?

    MongoDb实际上是一个很好的解决方案,还是我离开基地?

再次重述我的问题:我需要以易于搜索和排序的方式存储变量和未知结构的数据.

谢谢!



1> dcrosta..:

我不会将结果存储为文档中的嵌入文档form,因为您可能不知道先前提交了多少提交内容.MongoDB将每个文档限制为16MB,但实际上您可能希望保持低于此阈值.

由于您的表单是可变的,但是预先确定(即,每种表单可能有所不同,但表单是在某种管理UI中提前定义的),我建议使用两个集合:

第一个(调用它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或您使用的任何字段的索引来确定在提供Web请求时要显示的表单.

第二个集合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: "dcrosta@awesomesite.com",
    //any other fields here
  }
}

如果您需要能够通过提交的表单中的字段值对(或仅仅值)进行搜索,则此变体将使用values字段的数组,例如:

{ ...
  values: [
    { name: "username", value: "dcrosta" },
    { name: "email", value: "dcrosta@awesomesite.com" }
  ]
}

然后,您可以在该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"})

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有