MongoDB進(jìn)階之動(dòng)態(tài)字段設(shè)計(jì)詳解
本文主要介紹的是關(guān)于MongoDB動(dòng)態(tài)字段設(shè)計(jì)的相關(guān)資料,分享出來(lái)供大家參考學(xué)習(xí),需要的朋友們下面來(lái)一起看看詳細(xì)的介紹吧。
適宜讀者人群
- MongoDB開發(fā)者
基礎(chǔ)需求
產(chǎn)品: "我們要為現(xiàn)有的表單增加一個(gè)偉大的功能, 允許用戶增加想要的字段"
技術(shù)目標(biāo)version 1
存儲(chǔ)動(dòng)態(tài)表單數(shù)據(jù)(新增字段無(wú)需修改Schema)
首先講一講MongoDB支持的索引有哪幾種
普通字段索引
// 假如我們的文檔長(zhǎng)這樣 { "name": "MongoDB", "age": 5 } // 對(duì)age字段建立索引 { "age": 1 }
內(nèi)嵌文檔索引
// 假如我們的文檔長(zhǎng)成了Object { "person": { "age": 2, "name": "MongoDB" } } //對(duì)person.age字段建立索引 { "person.age": 1 }
數(shù)組文檔索引
// 假如我們的文檔長(zhǎng)成了數(shù)組 { "persons": [ { "name": "MongoDB", age: 5}, { "name": "MySQL", age: 20} ] } //對(duì)persons.age字段建立索引 { "persons.age": 1 }
看似上面只有都無(wú)法做到動(dòng)態(tài)增加字段的功能
程序員A和程序員S發(fā)生如下對(duì)話:
- 程序猿A: "那么我們需要增加另外一個(gè)collection來(lái)存儲(chǔ)動(dòng)態(tài)的內(nèi)容"
- 程序猿S: "但MongoDB對(duì)關(guān)聯(lián)查詢的支持很弱啊, 都沒(méi)法關(guān)聯(lián)排序, 要是后面產(chǎn)品說(shuō)要加 排序篩選 的功能我們就懵逼了呀☹️ , 唉~ 早知如此就不用MongoDB了"
再重新審視需求
- 存儲(chǔ)動(dòng)態(tài)表單數(shù)據(jù)
- 需要支持篩選和排序
技術(shù)目標(biāo)version2
增加字段同時(shí)還要可以索引
解決方案
- 使用數(shù)組來(lái)存儲(chǔ)動(dòng)態(tài)字段
- 增加描述collection用來(lái)記錄用戶的表單配置
存儲(chǔ)結(jié)構(gòu)如下:
//描述collection { "_id":"描述id", "type":"類型", "text": "訂單名稱", "default": "Default Name", } // 原本的表單增加字段form用來(lái)存儲(chǔ)動(dòng)態(tài)數(shù)據(jù) { "_id": "", "name": "一個(gè)好名字", "form":[ { "_id":"描述_id", "value": 10}, { "_id":"描述_id", "value": "我的好伙伴"}, ] }
注意!!! 當(dāng)用戶增加n個(gè)字段時(shí), 描述collection同時(shí)增加n個(gè)文檔
如何查詢排序篩選呢
// 比如用戶增加了2個(gè)字段 // 現(xiàn)在要對(duì)字段1進(jìn)行排序 db.items.find().sort({"form.0.value":1}) // 對(duì)字段2進(jìn)行篩選 db.items.find({"form.1.value":"我的好伙伴"})
上面的例子可以看出, 即使用戶未填寫該字段值, 但我們依舊需要為它進(jìn)行存儲(chǔ)空值, 以保證我們所有的Document的form下第n個(gè)字段均為同一個(gè)控件, 這樣我們就可以對(duì)字段進(jìn)行篩選排序, 并且可索引
繼續(xù)深入
產(chǎn)品: "我們需要允許用戶增加下拉框和多選框, 同樣需要篩選排序"
程序猿: "Fxxx"
那么這樣的數(shù)據(jù)應(yīng)該如何存儲(chǔ)呢?
解決方案如下:
我們的value按照1,2,4,8...的二進(jìn)制方式進(jìn)行存儲(chǔ)
如
用戶選擇單選框第一項(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([ { "$match": { "$elemMatch": { "描述id": "id", "value": { $bitsAnySet: [ 1, 5 ] } } }} ])
以上完成了使用MongoDB動(dòng)態(tài)字段設(shè)計(jì)的各種需求 😊
總結(jié)
- 增加配置collection, 用來(lái)描述用戶的配置
- 原始值需要存儲(chǔ)空值
- 如需類似下拉框, 多選框時(shí), 使用Bitwise Query Operators 來(lái)完成
- MongoDB并沒(méi)有那么弱, 也是可以滿足復(fù)雜的數(shù)據(jù)需求的
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
MongoDB中常用操作$addToSet、$pop和$rename
本文主要介紹了MongoDB中常用操作$addToSet、$pop和$rename,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-12-12MongoDB通過(guò)查詢與游標(biāo)徹底玩轉(zhuǎn)分布式文件存儲(chǔ)
MongoDB最大的特點(diǎn)是它支持的查詢語(yǔ)言非常強(qiáng)大,其語(yǔ)法有點(diǎn)類似于面向?qū)ο蟮牟樵冋Z(yǔ)言,幾乎可以實(shí)現(xiàn)類似關(guān)系數(shù)據(jù)庫(kù)單表查詢的絕大部分功能,而且還支持對(duì)數(shù)據(jù)建立索引,這篇文章主要介紹了MongoDB查詢與游標(biāo),徹底玩轉(zhuǎn)分布式文件存儲(chǔ),需要的朋友可以參考下2023-01-01MongoDB系列教程(五):mongo語(yǔ)法和mysql語(yǔ)法對(duì)比學(xué)習(xí)
這篇文章主要介紹了MongoDB系列教程(五):mongo語(yǔ)法和mysql語(yǔ)法對(duì)比學(xué)習(xí),本文對(duì)熟悉Mysql數(shù)據(jù)庫(kù)的同學(xué)來(lái)說(shuō)幫助很大,用對(duì)比的方式可以快速學(xué)習(xí)到MongoDB的命令,需要的朋友可以參考下2015-05-05mongodb增刪改查詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了mongodb增刪改查詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08MongoDB入門教程(包含安裝、常用命令、相關(guān)概念、使用技巧、常見操作等)
這篇文章主要介紹了MongoDB入門教程,包含安裝、常用命令、相關(guān)概念、使用技巧、常見操作等,是一篇比較好的入門文章,需要的朋友可以參考下2014-06-06