六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

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

[摘要]這篇文章主要給大家介紹了MongoDB進(jìn)階之動態(tài)字段設(shè)計(jì)的相關(guān)資料,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。本文主要介紹的是關(guān)于MongoDB動態(tài)字段設(shè)計(jì)的相關(guān)資料,分享出來供大家參考學(xué)習(xí),需要的朋友們下面來一起看看詳細(xì)的介紹吧。適宜讀者人群Mo...
這篇文章主要給大家介紹了MongoDB進(jìn)階之動態(tài)字段設(shè)計(jì)的相關(guān)資料,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。

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

適宜讀者人群

  • MongoDB開發(fā)者

基礎(chǔ)需求

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

技術(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: "那么我們需要增加另外一個(gè)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í)還要可以索引

解決方案

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

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

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

//描述collection 
{
 "_id":"描述id",
 "type":"類型",
 "text": "訂單名稱",
 "default": "Default Name",
}

// 原本的表單增加字段form用來存儲動態(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)在要對字段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([
 {
  "$match": {
  "$elemMatch": {
   "描述id": "id",
   "value": { $bitsAnySet: [ 1, 5 ] }
  }
 }}
])

以上完成了使用MongoDB動態(tài)字段設(shè)計(jì)的各種需求

以上就是MongoDB進(jìn)階篇之動態(tài)字段設(shè)計(jì)的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!


學(xué)習(xí)教程快速掌握從入門到精通的SQL知識。




主站蜘蛛池模板: 亚洲人色 | 亚洲国产一区在线观看 | 日本韩国伦理片 | 亚洲国产精品久久久久666 | 日韩色视频在线观看 | 天天操天天草 | 四虎影院永久地址 | 亚洲图片另类 | 日韩精品亚洲专区在线观看 | 色天天天天 | 日本视频中文字幕 | 香蕉久人久人青草青草 | 人人爱人人做 | 色综合久久综合中文小说 | 色噜噜狠狠一区二区三区 | 日本免费观看网站 | 香蕉久久夜色精品国产小优 | 亚洲欧美另类精品久久久 | 午夜爱| 婷婷综合激情网 | 五月天婷婷在线视频国产在线 | 怡春院日本一区二区久久 | 天堂影视网 | 一个色亚洲 | 青青草久热精品视频在线观看 | 一级毛片一片毛 | 色狠狠狠色噜噜噜综合网 | 日本三级2018亚洲视频 | 亚洲专区欧美 | 日韩免费视频观看 | 五月综合激情久久婷婷 | 欧美一级淫片aaaaaaa视频 | 一区二区免费视频观看 | 视频二区欧美 | 小明www永久在线看 小黄鸭b站视频在线 | 日本女人在线观看 | 四虎精品视频在线永久免费观看 | 色四月婷婷 | 天天狠狠弄夜夜狠狠躁·太爽了 | 香蕉成人福利片视频在线下载 | 五月天堂婷婷 |