【问题标题】:Compare two collections in MongoDb and remove common比较 MongoDb 中的两个集合并删除 common
【发布时间】:2018-09-01 07:33:17
【问题描述】:

我在 MongoDB 中有三个集合

  1. 成就
  2. 学生
  3. 学生成绩

achievements 是学生在一个学年可以取得的成就列表,同时 students collections 保存学校学生的数据列表。 student_achievements 保存文档,其中每个文档都包含学生 ID 和成就 ID。

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

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

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

【问题讨论】:

  • 请分享您的代码!谢谢
  • 我应该分享什么代码?我可以共享数据库模型。
  • 我在这里不要求任何代码,只是对前进的提示

标签: node.js mongodb express mongoose


【解决方案1】:

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

也许我们可以这样做:

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

然后你可以做这样的事情,它只会在成就数组唯一的情况下添加值:

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 钩子,在某些情况下,您也可能会出现孤立的关系。对于这些情况,最好的办法是定期运行 cron 任务,以便在需要时进行清理。这些是您在使用 NoSQL 存储时遇到的一些权衡。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多