本文主要介紹的是關于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發生如下對話:
再重新審視需求
技術目標version2
增加字段同時還要可以索引
解決方案
存儲結構如下:
//描述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動態字段設計的各種需求 😊
總結
好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。
新聞熱點
疑難解答