我正试图使用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
]
}
}
}
游乐场