什么';对于查找另一个集合中不存在指针的文档,MongoDB的最佳体系结构是什么? 用例

什么';对于查找另一个集合中不存在指针的文档,MongoDB的最佳体系结构是什么? 用例,mongodb,mongoose,Mongodb,Mongoose,这是一个科学博览会,评委们将登录平台,每个项目各得一分 我们正在努力解决的问题 法官想要访问URL,比如http://www.judge.com/next持续提供下一个尚未评分的项目,否则通知他们(因为所有项目都有该评委的评分)他们的评判职责已经完成 暗中射击 假设有三个集合,评委,项目和分数 judges: [{ _id name:String }] projects: [{ _id name:String }] scores: [{ _id type: enum

这是一个科学博览会,评委们将登录平台,每个项目各得一分

我们正在努力解决的问题 法官想要访问URL,比如
http://www.judge.com/next
持续提供下一个尚未评分的项目,否则通知他们(因为所有项目都有该评委的评分)他们的评判职责已经完成

暗中射击 假设有三个集合,评委项目分数

judges: [{
  _id
  name:String
}]

projects: [{
  _id
  name:String
}]

scores: [{
  _id
  type: enum
  judge: _id
  project: _id
}]
judges: [{
  _id
  name:String
  scores: [{
    _id
    type: enum
    project: _id
  }]
}]

projects: [{
  _id
  name:String
}]
使用SQL,笨蛋。 很明显。但问题是,如果我们必须在MongoDB中构建它,我们会怎么做?

黎明中的一枪 假设有两个集合,判断项目

judges: [{
  _id
  name:String
}]

projects: [{
  _id
  name:String
}]

scores: [{
  _id
  type: enum
  judge: _id
  project: _id
}]
judges: [{
  _id
  name:String
  scores: [{
    _id
    type: enum
    project: _id
  }]
}]

projects: [{
  _id
  name:String
}]

那么,什么是正确的架构呢?一般来说,MongoDB中的模式设计没有一个规范的“正确”答案;最佳方法取决于您的用例和数据

下面是使用
mongo
shell的一些想法,并注意一些注意事项

如果最后的任何一个查询没有返回结果,您就知道该人的判断职责已经履行。如果您想在判断完成后跳过执行此比较的过程,则始终可以在判断上设置并检查布尔值(即
donejuding

找出差异(在黑暗中接近拍摄)
  • 假设样本分数为:

    db.scores.insert([
       { judge: 123, project: 1, score: 5 },
       { judge: 123, project: 2, score: 6 },
       { judge: 123, project: 3, score: 9 },
       { judge: 123, project: 5, score: 9 },
    ])
    
  • 首先,找出评委评分的所有项目:

    var rated = db.scores.distinct('project', { judge: 123 })
    
  • 然后使用以下工具查找评委未评分的项目:

  • 示例结果(“所有未评分的项目,用于具有123的
    \u id
    的评委”):

  • 这种方法需要两个查询来计算最终结果,但也允许您为评委获取所有未评级项目的列表

  • 您不必在添加新项目时更新评委;新项目将自动显示为未分级

我知道你去年夏天是怎么判断的(黎明时分的一个镜头)
  • 在评委会开始前,为每个评委和项目组合预先分配
    分数
    数组:

    db.judges.insert(
       {
          _id: 123,
          name: "Bobby Tables",
          scores: [
            { project: 1, score: 5 },
            { project: 2, score: 6 },
            { project: 3, score: 9 },
            { project: 4 },
            { project: 5, score: 9 },
            { project: 6 },
          ]
      }
    
    )

  • 评判开始后,您可以更新或附加到
    分数
    数组中,但只有添加到
    评判
    文档中,项目才会显示为未评分

  • 使用查找指定评委的“下一个”未评分项目。
    $elemMatch
    投影将仅返回每个数组的第一个匹配元素

    db.judges.findOne(
        // query
        { _id: 123 },
        // projection
        {
           _id: 0,
           scores: {
              $elemMatch: { score: null }
           }
        }
    )
    
  • 示例结果(“具有
    \u id
    123评分的法官的下一个未评分项目”):

  • 这种方法使评委很容易获得“下一个项目”,但如果您想获得所有未分级的项目,则必须获取所有项目并在应用程序代码中过滤未分级的项目

  • 由于每个评委都有自己的未评分项目列表,因此您也可以使用此方法将项目子集分配给评委

  • 如果添加(或删除)项目,则必须更新所有文档


@Sumurai8感谢您的澄清;我已经把我的问题写了。@johnyhk谢谢你的澄清;我已经写下了我的问题。
{ "scores" : [ { "project" : 4 } ] }