<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      MongoDB進階篇之動態字段設計

      [摘要]這篇文章主要給大家介紹了MongoDB進階之動態字段設計的相關資料,文中介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面跟著小編一起來學習學習吧。本文主要介紹的是關于MongoDB動態字段設計的相關資料,分享出來供大家參考學習,需要的朋友們下面來一起看看詳細的介紹吧。適宜讀者人群Mo...
      這篇文章主要給大家介紹了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中文網其它相關文章!


      學習教程快速掌握從入門到精通的SQL知識。




      日韩精品一区二区三区高清