麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數(shù)據(jù)庫 > MongoDB > 正文

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

2020-03-14 12:57:22
字體:
供稿:網(wǎng)友

本文主要介紹的是關(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支持的索引有哪幾種

普通字段索引

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

內(nèi)嵌文檔索引

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

數(shù)組文檔索引

// 假如我們的文檔長成了數(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)行存儲空值, 以保證我們所有的Document的form下第n個字段均為同一個控件, 這樣我們就可以對字段進(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為我們提供了強(qiáng)大的Aggregate功能, 其中包含了Bitwise Query Operators 功能, 包含$bitsAllSet ,$bitsAnySet , $bitsAllClear , $bitsAnyClear

db.items.aggregate([ {  "$match": {  "$elemMatch": {   "描述id": "id",   "value": { $bitsAnySet: [ 1, 5 ] }  } }}])

以上完成了使用MongoDB動態(tài)字段設(shè)計的各種需求
注:相關(guān)教程知識閱讀請移步到MongoDB頻道。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 免费a级片视频 | 毛片视频网址 | 日本免费一区二区三区四区 | 日本在线观看视频网站 | 日日噜噜夜夜爽 | 久久老司机 | 成人在线观看小视频 | 国产乱淫a∨片免费观看 | 国产成人高潮免费观看精品 | 国产精品免费久久久 | 日韩激情一区 | 成人h精品动漫一区二区三区 | 欧美日性 | 成人毛片视频在线观看 | 午夜视频福利 | 欧美wwwsss9999| 久久网综合 | 黄色网络免费看 | 一本色道精品久久一区二区三区 | 美女在线观看视频一区二区 | 亚洲一级簧片 | 黄网站免费入口 | 欧美www| 午夜精品老牛av一区二区三区 | 爱操在线| 国产精品久久久久网站 | 婷婷一区二区三区四区 | 黄色片网站免费在线观看 | 午夜a狂野欧美一区二区 | 狠狠操夜夜爱 | 欧美一级黄色片免费观看 | 国产精品一区二区在线 | 精品亚洲一区二区三区 | av手机在线免费播放 | 色a综合 | 国产精品久久久久久久四虎电影 | 成人毛片在线 | 精品国产一区二区三区在线观看 | 男女羞羞视频在线观看免费 | 久久国产在线观看 | 久久久久久久久久一本门道91 |