搜尋

首頁  >  問答  >  主體

資料庫 - Mongodb多層嵌套數組如何精確查詢?

{
    "excelID": "10001",
    "excelName": "一年级学生信息",
    "sheetArrays": [
        {
            "sheetName": "一班",
            "studentInfos": [
                {
                    "name": "张三",
                    "sex": "男"
                },
                {
                    "name": "李四",
                    "sex": "男"
                }
            ]
        },
        {
            "sheetName": "二班",
            "studentInfos": [
                {
                    "name": "王五",
                    "sex": "男"
                },
                {
                    "name": "赵六",
                    "sex": "女"
                }
            ]
        }
    ]
}

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

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

漂亮男人漂亮男人2757 天前991

全部回覆(1)我來回復

  • 过去多啦不再A梦

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

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

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

    回覆
    0
  • 取消回覆