如何通过ID交叉引用Mongoose中的两个模型



我确信这个问题已经得到了回答,但我不确定我在搜索中的措辞是否正确。

假设我有两个模型:项目和用户

projectSchema = {
project_name: String,
users: [user_id]
}
userSchema = {
email: String,
projects: [project_id]
}

当用户试图创建一个新项目时,我想检查user.projects是否已经包括了一个他们试图创建的名称的项目,以避免重复。由于User.projects数组只包含项目的id,所以我遇到了麻烦。我确信Mongoose中存在一个方法,但如果不首先生成所有用户的project_id的数组并查询每个数组中的匹配名称,我很难找到一种简单的方法来做到这一点。

我看到很多关于的内容,大致看起来像

User.find({}).populate('projects').exec();

然而,我无法创建一个有效的实现。

我能够想出一个解决方案。虽然它肯定不优雅,但它是我能做的最好的。对于任何有同样问题的人,以下是我所做的:

const getTakenName = async () => {
return new Promise(resolve => {
Project.find({name: project.name})
.populate('users')
.exec((err, project) => {
if (err) return console.log(err);
for (let i in project) {
let sameName = project[i];
if (sameName.users.find(user => {
return user.user_id == req.user.id;
})) {
return resolve(true);
} 
}
resolve(false);
})
})
}
let takenName = await getTakenName();

这将查找具有给定名称的所有项目,然后按ID填充该项目的用户数组中的所有用户集合。从那里,它迭代所有匹配的项目,并在所有用户中搜索与当前用户匹配的ID。如果找到了一个,那么包含的承诺就变成了真的。否则,它将解析为false。

最新更新