使用mongooseNode js进行级联连接



我正试图使用NodeJs从MongoDB中获取数据。我有三个模式:项目、用户和团队。我需要根据工作用户type检索项目详细信息。我一直在为以下模式创建联接

项目:

const Project = new Schema({
projectName: { type: String, required: true, trim: true },
type: { type: String, required: true, trim: true },
teamID: { type: Schema.Types.ObjectId, required: true },
});

团队

const Team = new Schema({
teamId: { type: Schema.Types.ObjectId, required: true, trim: true },
users: { type: [Schema.Types.ObjectId], required: true, trim: true },
teamName: { type: String, required: true },
});

用户:

const User = new Schema({
userId: { type: Schema.Types.ObjectId, required: true, trim: true },
name: { type: String, required: true, trim: true },
profilePicture: { type: String, required: true, trim: true },
});

我正在设法获得

[
{
projectName: "s",
type: "w",
users: ["Jon", "Ali", "Mark"]
},
{
projectName: "a",
type: "w",
users: ["Jon", "Mark"]
},   {
projectName: "s",
type: "w",
users: ["Jon", "Ali", "Mark"]
},
]

我尝试使用$lookup,但我不能使用它,因为关系是复杂的多对多关系。有没有比检索所有用户、所有团队和所有项目更高效的方法

我认为除了聚合之外没有其他有效的方法,如果没有查找,我们就无法加入集合。您可以使用嵌套查找,

  • type$match条件
  • $lookup使用teamID加入团队集合
  • $match团队ID
  • $lookup使用users数组加入用户集合
  • $project使用$map转换用户名数组
  • $addFields使用$arrayElemAt获取用户中的用户数组
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
]
}
}
}

游乐场

相关内容

  • 没有找到相关文章

最新更新