MongoDB進(jìn)階篇之動態(tài)字段設(shè)計

這篇文章主要給大家介紹了mongodb進(jìn)階之動態(tài)字段設(shè)計的相關(guān)資料,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。

本文主要介紹的是關(guān)于mongodb動態(tài)字段設(shè)計的相關(guān)資料,分享出來供大家參考學(xué)習(xí),需要的朋友們下面來一起看看詳細(xì)的介紹吧。

適宜讀者人群

  • MongoDB開發(fā)者

基礎(chǔ)需求

產(chǎn)品: “我們要為現(xiàn)有的表單增加一個偉大的功能, 允許用戶增加想要的字段”

技術(shù)目標(biāo)version 1

存儲動態(tài)表單數(shù)據(jù)(新增字段無需修改Schema)

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

普通字段索引

//?假如我們的文檔長這樣  {  ?"name":?"MongoDB",  ?"age":?5  }    //?對age字段建立索引  {  ?"age":?1  }

內(nèi)嵌文檔索引

//?假如我們的文檔長成了Object  {  ?"person":?{  ??"age":?2,  ??"name":?"MongoDB"  ?}  }    //對person.age字段建立索引  {  ?"person.age":?1  }

mongodb文檔索引

//?假如我們的文檔長成了數(shù)組  {  ?"persons":?[  ??{?"name":?"MongoDB",?age:?5},  ??{?"name":?"MySQL",?age:?20}  ?]  }  //對persons.age字段建立索引  {  ?"persons.age":?1  }

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

程序員A和程序員S發(fā)生如下對話:

  • 程序猿A: “那么我們需要增加另外一個Collection來存儲動態(tài)的內(nèi)容”

  • 程序猿S: “但MongoDB對關(guān)聯(lián)查詢的支持很弱啊, 都沒法關(guān)聯(lián)排序, 要是后面產(chǎn)品說要加 排序篩選 的功能我們就懵逼了呀?? , 唉~ 早知如此就不用MongoDB了”

再重新審視需求

  • 存儲動態(tài)表單數(shù)據(jù)

  • 需要支持篩選和排序

技術(shù)目標(biāo)version2

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

解決方案

  • 使用數(shù)組來存儲動態(tài)字段

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

存儲結(jié)構(gòu)如下:

//描述collection?  {  ?"_id":"描述id",  ?"type":"類型",  ?"text":?"訂單名稱",  ?"default":?"Default?Name",  }    //?原本的表單增加字段form用來存儲動態(tài)數(shù)據(jù)  {  ?"_id":?"",  ?"name":?"一個好名字",  ?"form":[  ?{?"_id":"描述_id",?"value":?10},  ?{?"_id":"描述_id",?"value":?"我的好伙伴"},  ?]  }

注意!!! 當(dāng)用戶增加n個字段時, 描述collection同時增加n個文檔

如何查詢排序篩選呢

//?比如用戶增加了2個字段  //?現(xiàn)在要對字段1進(jìn)行排序  db.items.find().sort({"form.0.value":1})  //?對字段2進(jìn)行篩選  db.items.find({"form.1.value":"我的好伙伴"})

上面的例子可以看出, 即使用戶未填寫該字段值, 但我們依舊需要為它進(jìn)行存儲空值, 以保證我們所有的mongodb的form下第n個字段均為同一個mongodb, 這樣我們就可以對字段進(jìn)行篩選排序, 并且可索引

繼續(xù)深入

產(chǎn)品: “我們需要允許用戶增加下拉框和多選框, 同樣需要篩選排序”

程序猿: “Fxxx”

那么這樣的數(shù)據(jù)應(yīng)該如何存儲呢?

解決方案如下:

我們的value按照1,2,4,8…的二進(jìn)制方式進(jìn)行存儲

用戶選擇單選框第一項, 則存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動態(tài)字段設(shè)計的各種需求

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊6 分享