MongoDB進階篇之動態(tài)字段設(shè)計
發(fā)表時間:2023-08-24 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]這篇文章主要給大家介紹了MongoDB進階之動態(tài)字段設(shè)計的相關(guān)資料,文中介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面跟著小編一起來學習學習吧。本文主要介紹的是關(guān)于MongoDB動態(tài)字段設(shè)計的相關(guān)資料,分享出來供大家參考學習,需要的朋友們下面來一起看看詳細的介紹吧。適宜讀者人群Mo...
這篇文章主要給大家介紹了
MongoDB進階之動態(tài)字段設(shè)計的相關(guān)資料,文中介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面跟著小編一起來學習學習吧。
本文主要介紹的是關(guān)于MongoDB動態(tài)字段設(shè)計的相關(guān)資料,分享出來供大家參考學習,需要的朋友們下面來一起看看詳細的介紹吧。
適宜讀者人群
基礎(chǔ)需求
產(chǎn)品: "我們要為現(xiàn)有的表單增加一個偉大的功能, 允許用戶增加想要的字段"
技術(shù)目標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ù)目標version2
增加字段同時還要可以索引
解決方案
存儲結(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": "我的好伙伴"},
]
}
注意!!! 當用戶增加n個字段時, 描述collection同時增加n個文檔
如何查詢排序篩選呢
// 比如用戶增加了2個字段
// 現(xiàn)在要對字段1進行排序
db.items.find().sort({"form.0.value":1})
// 對字段2進行篩選
db.items.find({"form.1.value":"我的好伙伴"})
上面的例子可以看出, 即使用戶未填寫該字段值, 但我們依舊需要為它進行存儲空值, 以保證我們所有的Document的form下第n個字段均為同一個控件, 這樣我們就可以對字段進行篩選排序, 并且可索引
繼續(xù)深入
產(chǎn)品: "我們需要允許用戶增加下拉框和多選框, 同樣需要篩選排序"
程序猿: "Fxxx"
那么這樣的數(shù)據(jù)應(yīng)該如何存儲呢?
解決方案如下:
我們的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動態(tài)字段設(shè)計的各種需求
以上就是MongoDB進階篇之動態(tài)字段設(shè)計的詳細內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!
學習教程快速掌握從入門到精通的SQL知識。