《MongoDB 動(dòng)態(tài)字段設(shè)計(jì)》要點(diǎn):
本文介紹了MongoDB 動(dòng)態(tài)字段設(shè)計(jì),希望對您有用。如果有疑問,可以聯(lián)系我們。
相關(guān)主題:非關(guān)系型數(shù)據(jù)庫
《MongoDB 動(dòng)態(tài)字段設(shè)計(jì)》是否對您有啟發(fā),歡迎查看更多與《MongoDB 動(dòng)態(tài)字段設(shè)計(jì)》相關(guān)教程,學(xué)精學(xué)透。維易PHP學(xué)院為您提供精彩教程。
適宜讀者人群
MongoDB開發(fā)者
基礎(chǔ)需求
產(chǎn)品: "我們要為現(xiàn)有的表單增加一個(gè)偉大的功能, 允許用戶增加想要的字段"
技術(shù)目標(biāo)version 1
存儲動(dòng)態(tài)表單數(shù)據(jù)(新增字段無需修改Schema)
首先講一講MongoDB支持的索引有哪幾種
普通字段索引
// 假如我們的文檔長這樣
內(nèi)嵌文檔索引
// 假如我們的文檔長成了Object
數(shù)組文檔索引
// 假如我們的文檔長成了數(shù)組
看似上面只有都無法做到動(dòng)態(tài)增加字段的功能
程序員A和程序員S發(fā)生如下對話:
程序猿A: "那么我們需要增加另外一個(gè)collection來存儲動(dòng)態(tài)的內(nèi)容"
程序猿S: "但MongoDB對關(guān)聯(lián)查詢的支持很弱啊, 都沒法關(guān)聯(lián)排序, 要是后面產(chǎn)品說要加 排序篩選 的功能我們就懵逼了呀?? , 唉~ 早知如此就不用MongoDB了"
再重新審視需求
存儲動(dòng)態(tài)表單數(shù)據(jù)
需要支持篩選和排序
技術(shù)目標(biāo)version2
增加字段同時(shí)還要可以索引
解決方案
使用數(shù)組來存儲動(dòng)態(tài)字段
增加描述collection用來記錄用戶的表單配置
存儲結(jié)構(gòu)如下:
//描述collection
注意!!! 當(dāng)用戶增加n個(gè)字段時(shí), 描述collection同時(shí)增加n個(gè)文檔
如何查詢排序篩選呢
// 比如用戶增加了2個(gè)字段// 現(xiàn)在要對字段1進(jìn)行排序db.items.find().sort({"form.0.value":1})// 對字段2進(jìn)行篩選db.items.find({"form.1.value":"我的好伙伴"})
上面的例子可以看出, 即使用戶未填寫該字段值, 但我們依舊需要為它進(jìn)行存儲空值, 以保證我們所有的Document的form下第n個(gè)字段均為同一個(gè)控件, 這樣我們就可以對字段進(jìn)行篩選排序, 并且可索引
繼續(xù)深入
產(chǎn)品: "我們需要允許用戶增加下拉框和多選框, 同樣需要篩選排序"
程序猿: "Fxxx"
那么這樣的數(shù)據(jù)應(yīng)該如何存儲呢?
解決方案如下:
我們的value按照1,2,4,8...的二進(jìn)制方式進(jìn)行存儲
如
用戶選擇單選框第一項(xiàng), 則存1, 第二項(xiàng)則存2, 第三項(xiàng)則存4
用戶選擇多選框第一項(xiàng)+第三項(xiàng):則存5, (1+4)
MongoDB為我們提供了強(qiáng)大的Aggregate功能, 其中包含了Bitwise Query Operators 功能, 包含$bitsAllSet ,$bitsAnySet , $bitsAllClear , $bitsAnyClear
db.items.aggregate([
以上完成了使用MongoDB動(dòng)態(tài)字段設(shè)計(jì)的各種需求
總結(jié)
增加配置collection, 用來描述用戶的配置
原始值需要存儲空值
如需類似下拉框, 多選框時(shí), 使用Bitwise Query Operators 來完成
MongoDB并沒有那么弱, 也是可以滿足復(fù)雜的數(shù)據(jù)需求的
原文作者:RavenZZ
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/10160.html