a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 數據庫 > MongoDB > 正文

MongoDB進階之動態字段設計詳解

2020-10-29 18:46:29
字體:
來源:轉載
供稿:網友

本文主要介紹的是關于MongoDB動態字段設計的相關資料,分享出來供大家參考學習,需要的朋友們下面來一起看看詳細的介紹吧。

適宜讀者人群

  • MongoDB開發者

基礎需求

產品: "我們要為現有的表單增加一個偉大的功能, 允許用戶增加想要的字段"

技術目標version 1

存儲動態表單數據(新增字段無需修改Schema)

首先講一講MongoDB支持的索引有哪幾種

普通字段索引

// 假如我們的文檔長這樣{ "name": "MongoDB", "age": 5}// 對age字段建立索引{ "age": 1}

內嵌文檔索引

// 假如我們的文檔長成了Object{ "person": {  "age": 2,  "name": "MongoDB" }}//對person.age字段建立索引{ "person.age": 1}

數組文檔索引

// 假如我們的文檔長成了數組{ "persons": [  { "name": "MongoDB", age: 5},  { "name": "MySQL", age: 20} ]}//對persons.age字段建立索引{ "persons.age": 1}

看似上面只有都無法做到動態增加字段的功能

程序員A和程序員S發生如下對話:

  • 程序猿A: "那么我們需要增加另外一個collection來存儲動態的內容"
  • 程序猿S: "但MongoDB對關聯查詢的支持很弱啊, 都沒法關聯排序, 要是后面產品說要加 排序篩選 的功能我們就懵逼了呀☹️ , 唉~ 早知如此就不用MongoDB了"

再重新審視需求

  • 存儲動態表單數據
  • 需要支持篩選和排序

技術目標version2

增加字段同時還要可以索引

解決方案

  • 使用數組來存儲動態字段
  • 增加描述collection用來記錄用戶的表單配置

存儲結構如下:

//描述collection { "_id":"描述id", "type":"類型", "text": "訂單名稱", "default": "Default Name",}// 原本的表單增加字段form用來存儲動態數據{ "_id": "", "name": "一個好名字", "form":[ { "_id":"描述_id", "value": 10}, { "_id":"描述_id", "value": "我的好伙伴"}, ]}

注意!!! 當用戶增加n個字段時, 描述collection同時增加n個文檔

如何查詢排序篩選呢

// 比如用戶增加了2個字段// 現在要對字段1進行排序db.items.find().sort({"form.0.value":1})// 對字段2進行篩選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

db.items.aggregate([ {  "$match": {  "$elemMatch": {   "描述id": "id",   "value": { $bitsAnySet: [ 1, 5 ] }  } }}])

以上完成了使用MongoDB動態字段設計的各種需求 😊

總結

  • 增加配置collection, 用來描述用戶的配置
  • 原始值需要存儲空值
  • 如需類似下拉框, 多選框時, 使用Bitwise Query Operators 來完成
  • MongoDB并沒有那么弱, 也是可以滿足復雜的數據需求的

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 伊人yinren22综合开心 | 激情毛片| 热re99久久精品国99热线看 | 欧美午夜在线 | 黄色大片视频 | 国产精品久久久一区 | 亚洲国产精品一区二区三区 | 欧美黄视频在线观看 | 国产精品日产欧美久久久久 | 国产精品国产精品国产专区不卡 | 山外人精品 | 欧美国产亚洲一区 | 高清久久 | 国产依人在线 | 亚洲精品中文视频 | 中文字幕天天操 | 国产精品18| 在线看91| 97久久超碰 | 国产精品日本一区二区不卡视频 | 高清久久 | 99色资源 | 天天爽天天操 | 国产成在线观看免费视频 | 国产精品中文 | 久久久91精品国产一区二区 | 中文字幕一区二区三区在线视频 | 精品久久久精品 | 中文字幕第一区 | 亚洲情欲网 | 少妇高潮一级毛片 | 亚洲日韩视频免费观看 | 国产成人一区二区三区影院在线 | 四虎影视 | 视频在线一区 | 爱啪导航一精品导航站 | 自拍偷拍一区二区三区 | 啪啪免费小视频 | 国内自拍视频在线观看 | 美女视频黄色免费 | 欧美看片 |