mongodb 我如何交叉引用Mongoose by ID中的2个模特?

ryoqjall  于 2022-11-03  发布在  Go
关注(0)|答案(1)|浏览(142)

我确信这个问题已经得到了回答,但我不确定我在搜索中的措辞是否正确。
假设我有两个模型:项目和用户

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

当一个用户试图创建一个新项目时,我想检查一下该User.projects是否已经包含了一个与他们试图创建的项目同名的项目,以避免重复。我有麻烦了。我肯定 Mongoose 里有办法,但我...如果不首先生成一个包含所有用户project_id的数组并查询每个数组以找到匹配的名称,我很难找到一种简单的方法来实现这一点。
我看过很多人提到的东西,大致看起来像:

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

但是我不能创建一个工作的实现。

a0zr77ik

a0zr77ik1#

我想出了一个解决方案。虽然这个方案并不优雅,但这是我能做的最好的了。对于任何有同样问题的人,我做了以下事情:

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的项目。如果找到,则封装承诺解析为true。否则,解析为false。

相关问题