資料庫 - Mongodb多層嵌套數組如何精確查詢?
漂亮男人
漂亮男人 2017-05-02 09:21:41
0
1
1014
{
    "excelID": "10001",
    "excelName": "一年级学生信息",
    "sheetArrays": [
        {
            "sheetName": "一班",
            "studentInfos": [
                {
                    "name": "张三",
                    "sex": "男"
                },
                {
                    "name": "李四",
                    "sex": "男"
                }
            ]
        },
        {
            "sheetName": "二班",
            "studentInfos": [
                {
                    "name": "王五",
                    "sex": "男"
                },
                {
                    "name": "赵六",
                    "sex": "女"
                }
            ]
        }
    ]
}

我希望透過一條語句查出所有sex為男的人員的名稱;

我還希望能透過一語句查出name為王五對應的班級和他的基本信息,求朋友們為我答疑解惑,感激不盡。

漂亮男人
漂亮男人

全部回覆(1)
过去多啦不再A梦

一條語句是怎麼個概念呢? 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章節。
基本的原則其實就是沒有原則,這比滿足關係範式要麻煩多了,沒有一條準則告訴你該怎麼做。但基本上,你選擇的資料模型要考慮到如何使用的各種場景,如何更新,如何插入,如何查詢…能夠很好地滿足使用場景的模型就是一個好的模型。
回到你的模型上來,看看有什麼問題:

  1. 以WT引擎為例,文檔級鎖,當有任何一個班級的任何一個人有變動的時候,都會對這一個文檔做變更,也就是說這些操作全部是互斥的,效率上面可以想像有多差。

  2. 上面的查詢你也看到了,既不優雅效率也不高。更新的時候就更不用說了,想想都很麻煩。
    所以這不是一個好模型。 MongoDB雖然提倡反範式,但也不要這麼極端為了反範式而反範式。換一個對你自己使用更方便的模型試試看。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板