【问题标题】:How to setup n:m relations in feathersjs with mongoose?如何用猫鼬在feathersjs中设置n:m关系?
【发布时间】:2021-03-31 22:49:49
【问题描述】:

我正在使用 feathersjs 开发第一个项目,并希望将它与 MongoDB 一起使用(并将 mongoose 作为支持的驱动程序)。 但是,我想到了可以进行一些优化的地方(这就是我的想法......)

我在用户实体和项目实体之间有 n:m 关系。所以一个用户可以有很多项目,一个项目可以有很多用户。

我发现我可以如下声明与猫鼬的这种关系:

用户模型:

projects: [
  { type: mongooseClient.Schema.Types.ObjectId, ref: 'Projects' }
]

项目模型

users: [
  { type: mongooseClient.Schema.Types.ObjectId, ref: 'Users' }
]

这可以按我的意愿工作。 现在,我学到了一些关于 MongoDB 的东西,所以它不关心任何对象关系,例如删除一个项目。所以当一个项目被删除时,用户实体会在它的“projects-attribute”中保留被删除项目的ID。

我为此手动实现了如下逻辑:

async remove(id: string, params?: Params) {

const project = (await app.service("projects").get(id)) as ProjectData
const users = project.users;
// User-Table of projects must be set
for(let user of users!) {
  const newUserProjects = (await app.service("users").get(user)).projects!.filter(p => p.toString() !== id.toString());

  app.service("users").patch(user!, {
    projects: newUserProjects ? newUserProjects : []
  });
}
return super.remove(id, params);

}

现在应该很明显了,我对这个堆栈很陌生——尤其是 MongoDB。有没有更好的方法来处理这种情况?像这样,我会有很多数据库访问——这并不是一件好事。当然,这种情况还有很多(打补丁、创建等)。

提前致谢!如果有人可以为这个问题提供一个好主意或一些 MongoDB / mongoose 魔法,我会很高兴!

佛斯曼

【问题讨论】:

    标签: node.js mongodb mongoose relationship feathersjs


    【解决方案1】:

    这是一个常见的问题,我通常只在一个模型中保留参考来解决它。

    如果我正确阅读了 OP,那么我假设

    • 1 个项目可以有 X 个用户
    • 1 用户可以拥有 X 个项目
    • 如果删除了 1 个项目,则也应删除对该项目的所有引用(来自用户)。

    简单的解决方案

    在删除所有不需要的引用时,为了减少数据库访问次数,一个简单的解决方案是保持关系绑定到模型之一,用户或项目。由于项目将是一件事,它可能比用户更频繁地被删除,我建议将关系保留在项目模型中。

    // Project Model
    users: [
      { type: mongooseClient.Schema.Types.ObjectId, ref: 'Users' }
    ]
    

    现在您可能会想,如果您不在用户模型中保留对项目的引用,您如何获得 1 个特定用户的所有项目?简单:

    // just an example, using expressjs route
    // but part of the mongoose query should be the same
    
    app.get('/user/:id/projects', (req, res) => {
    
      const userid = req.params.id;
      const userprojects = await Project.find({ users: {$in: [userid]}}).exec();
      return res.status(200).json(userprojects);
    
    });
    
    

    您在那里看到的 ☝ 是如何使用项目模型来查找特定用户的所有项目。现在,如果项目被删除,没有人最终会获得对它的死胡同。

    缺点

    所以我们减少了数据库访问的数量,但是,如果我们删除一个用户,另一边的项目可能仍然有那个引用 - 我想让你检查一下其他的东西:Mongoose Middleware

    // you can add a pre hook to your User Schema, like this 
    UserSchema.pre('deleteOne', { document: true }, function(next) {
      console.log(this); // this : User Document to be deleted
      // do stuff here
      next();
    });
    
    

    【讨论】:

    • 我明白了 - mongoDB 有一些事情通常需要考虑。您的解决方案很简单,老实说,这是一个非常好的主意。我会试试的 - 非常感谢!
    • 很高兴我能给你一些关于 mongodb/mongoose 的建议,我个人喜欢使用它,因为它非常简单。
    猜你喜欢
    • 2017-03-31
    • 2014-06-15
    • 2017-07-20
    • 2018-02-22
    • 2020-07-02
    • 1970-01-01
    • 2023-03-19
    • 2012-11-15
    • 1970-01-01
    相关资源
    最近更新 更多