问题描述
我正在尝试使用 Node Js 从MongoDB中获取数据。我有三种模式:项目,用户和团队。
我需要根据工作人员用户的type
来检索项目详细信息。
我被困在为这些架构加入:
项目:
const Project = new Schema({
projectName: { type: String,required: true,trim: true },type: { type: String,teamID: { type: Schema.Types.ObjectId,required: true },});
团队
const Team = new Schema({
teamId: { type: Schema.Types.ObjectId,users: { type: [Schema.Types.ObjectId],teamName: { type: String,});
用户:
const User = new Schema({
userId: { type: Schema.Types.ObjectId,name: { type: String,profilePicture: { type: String,});
我正在设法找到一种方法
[
{
projectName: "s",type: "w",users: ["Jon","Ali","Mark"]
},{
projectName: "a",{
projectName: "s",]
我尝试使用$lookup
,但由于该关系是多对多关系,因此无法使用。
是否有比检索所有用户,所有团队和所有项目更有效的方法?
解决方法
我认为除了聚合,没有其他有效的方法,没有查找,我们就无法加入集合,您可以使用嵌套查找,
-
type
条件 -
$lookup
使用teamID
加入团队收藏
-
$match
teamID -
$lookup
使用users
数组加入用户集合 -
$project
使用$map
转换用户的名称数组 -
$addFields
获取使用$arrayElemAt
的用户中的用户数组
$match
的db.Project.aggregate([
{ $match: { type: "w" } },{
$lookup: {
from: "Team",let: { teamID: "$teamID" },as: "users",pipeline: [
{ $match: { $expr: { $eq: ["$$teamID","$teamId"] } } },{
$lookup: {
from: "User",localField: "users",foreignField: "userId",as: "users"
}
},{
$project: {
users: {
$map: {
input: "$users",in: "$$this.name"
}
}
}
}
]
}
},{ $addFields: { users: { $arrayElemAt: ["$users.users",0] } } }
])
第二种可能的方法是,您可以将$project
和$addFields
个阶段组合为一个阶段,
{
$addFields: {
users: {
$arrayElemAt: [
{
$map: {
input: "$users.users",in: "$$this.name"
}
},0
]
}
}
}