MongoDB 動態字段設計

NoSQL MongoDB 程序員 科技 極客聊天 2017-06-14

適宜讀者人群

  • MongoDB開發者

基礎需求

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

技術目標version 1

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

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

普通字段索引

// 假如我們的文檔長這樣

內嵌文檔索引

// 假如我們的文檔長成了Object

數組文檔索引

// 假如我們的文檔長成了數組

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

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

程序猿A: "那麼我們需要增加另外一個collection來存儲動態的內容"

程序猿S: "但MongoDB對關聯查詢的支持很弱啊, 都沒法關聯排序, 要是後面產品說要加 排序篩選 的功能我們就懵逼了呀☹️ , 唉~ 早知如此就不用MongoDB了"

再重新審視需求

  1. 存儲動態表單數據

  2. 需要支持篩選和排序

技術目標version2

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

解決方案

  • 使用數組來存儲動態字段

  • 增加描述collection用來記錄用戶的表單配置

存儲結構如下:

//描述collection

注意!!! 當用戶增加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([

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

總結

  1. 增加配置collection, 用來描述用戶的配置

  2. 原始值需要存儲空值

  3. 如需類似下拉框, 多選框時, 使用Bitwise Query Operators 來完成

  4. MongoDB並沒有那麼弱, 也是可以滿足複雜的數據需求的

原文作者:RavenZZ

相關推薦

推薦中...