数据库 - Mongodb多层嵌套数组如何精确查询?

浏览:31日期:2023-06-23

问题描述

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

我希望通过一条语句查出所有sex为男的人员的名称;

我还希望能通过一条语句查出name为王五对应的班级和他的基本信息,求朋友们为我答疑解惑,感激不尽。

问题解答

回答1:

一条语句是怎么个概念呢?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虽然提倡反范式,但也不要这么极端为了反范式而反范式。换一个对你自己使用更方便的模型试试。

相关文章: