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

发布于 2022-09-03 13:24:44 字数 795 浏览 25 评论 0

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

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

白况 2022-09-10 13:24:45

如果我要在studentInfos里面的数组加一个age字段,怎么统计age的avaverage

粉红×色少女 2022-09-10 13:24:44

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文