這篇文章主要給大家介紹了MongoDB進階之動態欄位設計的相關資料,文中介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面跟著小編一起來學習學習吧。
本文主要介紹的是關於MongoDB動態欄位設計的相關資料,分享出來供大家參考學習,需要的朋友們下面來一起看看詳細的介紹吧。
適宜讀者群
#MongoDB開發者
#MongoDB開發者
##基礎需求
產品: "我們要為現有的表單增加一個偉大的功能, 允許使用者增加想要的欄位"
儲存動態表單資料(新增欄位無須修改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發生如下對話:
程式猿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動態欄位設計的各種需求###
以上是MongoDB進階篇之動態欄位設計的詳細內容。更多資訊請關注PHP中文網其他相關文章!