多对多关系介绍
在MongoDB中,如果我们需要在两个集合之间建立多对多关系,我们需要使用到中间件的概念。中间件是一种类似于关联表的概念,其中的记录包含两个集合之间的关系。在中间件中,我们需要定义两个集合的_id字段,以及其他字段,这些其他字段可以用来描述两者之间的关系,可以是单向的或者是双向的关系。
//中间件创建示例
db.createCollection("employees") //创建员工集合
db.createCollection("projects") //创建项目集合
db.createCollection("assignments") //创建中间件集合
多对多关系查询
查询集合中未建立关系的记录
在多对多关系中,查询中间件中未建立关联的记录是比较常见的需求。这个需求可以通过使用聚合框架来完成。
首先,我们需要使用$lookup聚合操作符,在中间件集合中找到所有与项目相关的记录,然后使用$match聚合操作符来过滤掉已经建立了关系的记录。最后,使用$project聚合操作符来返回满足条件的记录。
db.projects.aggregate([
{
$lookup:
{
from: "assignments",
localField: "_id",
foreignField: "projectId",
as: "assignments"
}
},
{ $unwind: "$assignments" },
{
$lookup:
{
from: "employees",
localField: "assignments.employeeId",
foreignField: "_id",
as: "employee"
}
},
{
$match: { "employee": { $size: 0 } }
},
{
$project:
{
"_id":1,
"name":1,
"deadline":1
}
}
])
上述代码中,我们首先在projects集合中使用$lookup查找所有的中间件记录,然后使用$unwind展开其中的数组字段,以便于我们后续的聚合操作。接着,我们在中间件集合和employees集合之间进行了第二次$lookup操作,使用了assignments集合中的employeeId字段来查找对应的员工记录。最后,我们使用了$match聚合操作符,对最终查询的结果进行了一次过滤,只返回那些还未建立关系的记录。
查询集合中已建立关系的记录
除了查询未建立关系的记录之外,我们也可以查询已经建立关系的记录。同样地,我们可以使用聚合框架来完成这个需求。
在这个查询中,我们需要使用$match聚合操作符来筛选出指定的查询条件,然后使用$lookup聚合操作符来查找相关联的记录,最后使用$project聚合操作符来返回查询结果。
db.employees.aggregate([
{
$lookup:
{
from: "assignments",
localField: "_id",
foreignField: "employeeId",
as: "assignments"
}
},
{ $unwind: "$assignments" },
{
$lookup:
{
from: "projects",
localField: "assignments.projectId",
foreignField: "_id",
as: "projects"
}
},
{
$match: { "projects.name": "MongoDB Project" }
},
{
$project:
{
"_id":1,
"name":1,
"address":1,
"projects.name":1
}
}
])
上述代码中,我们首先在employees集合中使用$lookup查找所有的中间件记录,然后使用$unwind展开其中的数组字段,以便于我们后续的聚合操作。接着,我们在中间件集合和projects集合之间进行了第二次$lookup操作,使用了assignments集合中的projectId字段来查找对应的项目记录。最后,我们使用了$match聚合操作符和查询条件来筛选出满足条件的记录,并使用$project聚合操作符,只返回我们需要的字段。