MST

星途 面试题库

面试题:MongoDB数组嵌套场景下的存储与查询优化

假设有一个MongoDB集合用于存储公司项目信息,每个项目文档中有一个数组字段,该数组中的每个元素又是一个包含任务列表的子文档(任务列表也是数组类型)。例如:{projectName: '项目1', tasksGroups: [{taskList: ['任务1', '任务2']}, {taskList: ['任务3', '任务4']}]}。如何高效存储这样的数据结构,并且优化对特定任务的查询,如查询包含'任务3'的项目?请说明存储设计、索引使用及查询语句。
14.8万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

存储设计

  1. 文档结构:保持题目给定的文档结构,即每个项目文档包含项目名称和一个tasksGroups数组,数组元素是包含taskList数组的子文档。这样的结构符合项目 - 任务组 - 任务的层次关系,也便于理解和维护。

索引使用

  1. 建立复合索引:为了优化对特定任务的查询,在tasksGroups.taskList字段上建立索引。因为tasksGroups是数组,taskList也是数组,MongoDB支持对嵌套数组字段建立索引。在MongoDB Shell中,可以使用以下命令创建索引:
db.yourCollectionName.createIndex({"tasksGroups.taskList": 1});

这样的索引可以加快对特定任务的查询速度。

查询语句

使用$elemMatch操作符结合$in操作符来查询包含特定任务的项目。假设集合名称为projects,查询包含'任务3'的项目的语句如下:

db.projects.find({
    "tasksGroups": {
        $elemMatch: {
            "taskList": {
                $in: ['任务3']
            }
        }
    }
});

$elemMatch操作符用于匹配数组中的元素,使得在tasksGroups数组中找到包含taskList数组里有'任务3'的子文档。$in操作符用于检查数组中是否包含指定的值。