比较MongoDb中的两个集合并删除co​​mmon

时间:2018-03-22 18:19:03

标签: node.js mongodb express mongoose

我在MongoDB中有三个集合

  1. 成就
  2. 学生
  3. student_achievements
  4. achievements是学生在一学年可以取得的成就列表 students个收藏品包含学校学生的数据清单。 student_achievements包含每个文档包含studentId& achievementId。

    我有一个界面,我使用select2 multiselect将achievements中的一个或多个成就分配给students的学生,并将其保存到他们的集合student_achievements,现在为此,我使用数据库中的可用成就填充select2。我还做了一个安排,如果学生再次被分配相同的成绩,系统会抛出错误。

    我想要实现的目标是如果成绩分配给学生,该成绩不应该在列表中可用,或者在获取列表时删除w.r.t学生ID,

    我可以使用mongodb或其聚合框架中的哪些函数来实现这一点,即与集合进行比较并删除常见函数。

1 个答案:

答案 0 :(得分:0)

也许您的数据结构可能会有所不同,以使问题更容易解决。 MongoDB是一个NoSQL无模式存储,不要试图让它像关系数据库一样。

也许我们可以这样做:

var StudentSchmea = new Schema({
    name: String,
    achievements: [{ type: Schema.Types.ObjectId, ref: 'Achivement' }]
});

然后你可以做这样的事情,如果它对achievement数组是唯一的,那么它只会添加值:

db.student.update(
   { _id: 1 },
   { $addToSet: { achievements: <achivement id> } }
)

如果你使用像Mongoose这样的东西,你也可以编写自己的中间件来删除孤立的文档:

AchivementSchema.post('remove', function(next) {
    // Remove all references to achievements in Student schema
});

此外,如果在将其添加到集合之前需要验证成就是否存在,则可以在更新/插入之前执行findOne查询以进行验证。

即使使用post remove hook,在某些情况下,您最终可能会遇到孤立的关系。对于这些情况,最好的办法是定期运行cron任务,以便在需要时进行清理。这些是使用NoSQL商店时遇到的一些权衡。