首頁  >  文章  >  資料庫  >  MongoDB進階篇之動態欄位設計

MongoDB進階篇之動態欄位設計

零下一度
零下一度原創
2018-05-17 14:00:502370瀏覽

這篇文章主要給大家介紹了MongoDB進階之動態欄位設計的相關資料,文中介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面跟著小編一起來學習學習吧。

本文主要介紹的是關於MongoDB動態欄位設計的相關資料,分享出來供大家參考學習,需要的朋友們下面來一起看看詳細的介紹吧。

適宜讀者群

  • #MongoDB開發者

#MongoDB開發者


##基礎需求

產品: "我們要為現有的表單增加一個偉大的功能, 允許使用者增加想要的欄位"


#技術目標version 1

儲存動態表單資料(新增欄位無須修改Schema)

先講一講MongoDB支援的索引有哪幾種

普通欄位索引

// 假如我们的文档长这样
{
 "name": "MongoDB",
 "age": 5
}

// 对age字段建立索引
{
 "age": 1
}

內嵌文件索引


// 假如我们的文档长成了Object
{
 "person": {
  "age": 2,
  "name": "MongoDB"
 }
}

//对person.age字段建立索引
{
 "person.age": 1
}

陣列
    文件索引
  • // 假如我们的文档长成了数组
    {
     "persons": [
      { "name": "MongoDB", age: 5},
      { "name": "MySQL", age: 20}
     ]
    }
    //对persons.age字段建立索引
    {
     "persons.age": 1
    }

    #看似上面只有都無法做到動態增加欄位的功能
  • 程式設計師A和程式設計師S發生如下對話:

程式猿A: "那麼我們需要增加另外一個collection來儲存動態的內容"

程式猿S: "但MongoDB對關聯查詢的支援很弱啊, 都沒法關聯排序, 要是後面產品說要加排序篩選的功能我們就懵逼了呀☹️ , 唉~ 早知如此就不用MongoDB了"
  • 再重新檢視需求

儲存動態表單資料需要支援篩選和排序


技術目標version2

  • 增加欄位同時還要可以索引

  • 解決方案


使用陣列來儲存動態欄位

##增加描述collection用來記錄用戶的表單配置
。儲存結構如下:

//描述collection 
{
 "_id":"描述id",
 "type":"类型",
 "text": "订单名称",
 "default": "Default Name",
}

// 原本的表单增加字段form用来存储动态数据
{
 "_id": "",
 "name": "一个好名字",
 "form":[
 { "_id":"描述_id", "value": 10},
 { "_id":"描述_id", "value": "我的好伙伴"},
 ]
}

注意!!! 當用戶增加n個欄位時, 描述collection同時增加n個文件
如何查詢排序篩選呢

// 比如用户增加了2个字段
// 现在要对字段1进行排序
db.items.find().sort({"form.0.value":1})
// 对字段2进行筛选
db.items.find({"form.1.value":"我的好伙伴"})

上面的例子可以看出, 即使使用者未填入該欄位值, 但我們依舊需要為它進行儲存空值, 以保證我們所有的Document的form下第n個欄位均為同一個控制項, 這樣我們就可以對欄位進行篩選排序, 並且可索引


繼續深入


#產品: "我們需要允許使用者增加下拉框和多選框, 同樣需要篩選排序"

程式猿類: "Fxxx"#​​
##那麼這樣的資料應該如何儲存呢?


解決方案如下:


我們的value依照1,2,4,8...的二進位方式進行儲存

使用者選擇單選框第一項, 則存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動態欄位設計的各種需求###

以上是MongoDB進階篇之動態欄位設計的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn