我在MongoDB中有三个集合
achievements
是学生在一学年可以取得的成就列表
students
个收藏品包含学校学生的数据清单。
student_achievements
包含每个文档包含studentId& achievementId。
我有一个界面,我使用select2
multiselect将achievements
中的一个或多个成就分配给students
的学生,并将其保存到他们的集合student_achievements
,现在为此,我使用数据库中的可用成就填充select2
。我还做了一个安排,如果学生再次被分配相同的成绩,系统会抛出错误。
我想要实现的目标是如果成绩分配给学生,该成绩不应该在列表中可用,或者在获取列表时删除w.r.t学生ID,
我可以使用mongodb或其聚合框架中的哪些函数来实现这一点,即与集合进行比较并删除常见函数。
答案 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商店时遇到的一些权衡。