{
"excelID": "10001",
"excelName": "一年级学生信息",
"sheetArrays": [
{
"sheetName": "一班",
"studentInfos": [
{
"name": "张三",
"sex": "男"
},
{
"name": "李四",
"sex": "男"
}
]
},
{
"sheetName": "二班",
"studentInfos": [
{
"name": "王五",
"sex": "男"
},
{
"name": "赵六",
"sex": "女"
}
]
}
]
}
我希望透過一條語句查出所有sex為男的人員的名稱;
我還希望能透過一語句查出name為王五對應的班級和他的基本信息,求朋友們為我答疑解惑,感激不盡。
过去多啦不再A梦2017-05-02 09:23:41
一條語句是怎麼個概念呢? aggregation
算一條語句嗎?
db.test3.aggregate([
{$match: {"sheetArrays.studentInfos.sex": '男'}},
{$unwind: "$sheetArrays"},
{$unwind: "$sheetArrays.studentInfos"},
{$match: {"sheetArrays.studentInfos.sex": '男'}},
]);
db.test3.aggregate([
{$match: {"sheetArrays.studentInfos.name": '王五'}},
{$unwind: "$sheetArrays"},
{$unwind: "$sheetArrays.studentInfos"},
{$match: {"sheetArrays.studentInfos.name": '王五'}},
]);
雖然能做到,但實際上這樣的資料結構並不合理。
MongoDB的模型設計是個大主題,有興趣可以仔細閱讀下文檔的data modeling章節。
基本的原則其實就是沒有原則,這比滿足關係範式要麻煩多了,沒有一條準則告訴你該怎麼做。但基本上,你選擇的資料模型要考慮到如何使用的各種場景,如何更新,如何插入,如何查詢…能夠很好地滿足使用場景的模型就是一個好的模型。
回到你的模型上來,看看有什麼問題:
以WT引擎為例,文檔級鎖,當有任何一個班級的任何一個人有變動的時候,都會對這一個文檔做變更,也就是說這些操作全部是互斥的,效率上面可以想像有多差。
上面的查詢你也看到了,既不優雅效率也不高。更新的時候就更不用說了,想想都很麻煩。
所以這不是一個好模型。 MongoDB雖然提倡反範式,但也不要這麼極端為了反範式而反範式。換一個對你自己使用更方便的模型試試看。