首页
论坛
社团
我的

ADSKN论坛

 找回密码
立即注册

扫一扫,微信登陆

开启左侧

MongoDB进阶之动态字段计划 详解

[复制链接]
 楼主| 一直坚持到底 发表于2022-7-19 00:14:55 | 显示全部楼层 |阅读模式 | 来自 上海市 腾讯云

马上注册加入论坛,获取更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

本文重要 先容 的是关于MongoDB动态字段计划 的相干 资料,分享出来供各人 参考学习,必要 的朋侪 们下面来一起看看具体 的先容 吧。

相宜 读者人群

  • MongoDB开发者

底子 需求

产物 : "我们要为现有的表单增加一个伟大的功能, 允许用户增加想要的字段"

技能 目的 version 1

存储动态表单数据(新增字段无需修改Schema)

起首 讲一讲MongoDB支持的索引有哪几种

普通字段索引

  1. // 如果 我们的文档长如许
  2. {
  3. "name": "MongoDB",
  4. "age": 5
  5. }
  6. // 对age字段创建 索引
  7. {
  8. "age": 1
  9. }
复制代码

内嵌文档索引

  1. // 如果 我们的文档长成了Object
  2. {
  3. "person": {
  4. "age": 2,
  5. "name": "MongoDB"
  6. }
  7. }
  8. //对person.age字段创建 索引
  9. {
  10. "person.age": 1
  11. }
复制代码

数组文档索引

  1. // 如果 我们的文档长成了数组
  2. {
  3. "persons": [
  4. { "name": "MongoDB", age: 5},
  5. { "name": "MySQL", age: 20}
  6. ]
  7. }
  8. //对persons.age字段创建 索引
  9. {
  10. "persons.age": 1
  11. }
复制代码

看似上面只有都无法做到动态增加字段的功能

步伐 员A和步伐 员S发生如下对话:

  • 步伐 猿A: "那么我们必要 增加另外一个collection来存储动态的内容"
  • 步伐 猿S: "但MongoDB对关联查询的支持很弱啊, 都没法关联排序, 要是背面 产物 说要加 排序筛选 的功能我们就懵逼了呀☹️ , 唉~ 早知云云 就不用MongoDB了"

再重新审视需求

  • 存储动态表单数据
  • 必要 支持筛选和排序

技能 目的 version2

增加字段同时还要可以索引

办理 方案

  • 使用数组来存储动态字段
  • 增加形貌 collection用来记任命 户的表单设置

存储结构 如下:

  1. //形貌 collection
  2. {
  3. "_id":"形貌 id",
  4. "type":"类型",
  5. "text": "订单名称",
  6. "default": "Default Name",
  7. }
  8. // 原本的表单增加字段form用来存储动态数据
  9. {
  10. "_id": "",
  11. "name": "一个好名字",
  12. "form":[
  13. { "_id":"形貌 _id", "value": 10},
  14. { "_id":"形貌 _id", "value": "我的好同伴 "},
  15. ]
  16. }
复制代码

注意!!! 当用户增加n个字段时, 形貌 collection同时增加n个文档

如何查询排序筛选呢

  1. // 好比用户增加了2个字段
  2. // 现在要对字段1进行排序
  3. db.items.find().sort({"form.0.value":1})
  4. // 对字段2进行筛选
  5. db.items.find({"form.1.value":"我的好同伴 "})
复制代码

上面的例子可以看出, 即使用户未填写该字段值, 但我们仍旧 必要 为它进行存储空值, 以包管我们所有的Document的form下第n个字段均为同一个控件, 如许 我们就可以对字段进行筛选排序, 而且可索引

继承 深入

产物 : "我们必要 允许用户增加下拉框和多选框, 同样必要 筛选排序"

步伐 猿: "Fxxx"

那么如许 的数据应该如何存储呢?

办理 方案如下:

我们的value按照1,2,4,8...的二进制方式进行存储


用户选择单选框第一项, 则存1, 第二项则存2, 第三项则存4

用户选择多选框第一项+第三项:则存5, (1+4)

MongoDB为我们提供了强盛 的Aggregate功能, 此中 包含了Bitwise Query Operators 功能, 包含$bitsAllSet ,$bitsAnySet , $bitsAllClear , $bitsAnyClear

  1. db.items.aggregate([
  2. {
  3. "$match": {
  4. "$elemMatch": {
  5. "形貌 id": "id",
  6. "value": { $bitsAnySet: [ 1, 5 ] }
  7. }
  8. }}
  9. ])
复制代码

以上完成了使用MongoDB动态字段计划 的各种需求 😊

总结

  • 增加设置 collection, 用来形貌 用户的设置
  • 原始值必要 存储空值
  • 如需类似下拉框, 多选框时, 使用Bitwise Query Operators 来完成
  • MongoDB并没有那么弱, 也是可以满足 复杂的数据需求的

好了,以上就是这篇文章的全部内容了,希望本文的内容对各人 的学习或者工作能带来一定的帮助,如果 有疑问各人 可以留言交流,谢谢各人 对脚本之家的支持。


来源:https://www.jb51.net/article/116426.htm
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
公告
  • 问题反馈请扫码加入一期核心用户群
  • [学生认证] 认证后获取生活类板块发帖权限
高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 需要先绑定手机号

QQ|Archiver|手机版|小黑屋|ADSKN短链接收益平台 ( 冀ICP备2021002162号 )

GMT+8, 2022-12-4 19:18 , Processed in 0.340928 second(s), 14 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表