什么';对于查找另一个集合中不存在指针的文档,MongoDB的最佳体系结构是什么? 用例
这是一个科学博览会,评委们将登录平台,每个项目各得一分 我们正在努力解决的问题 法官想要访问URL,比如什么';对于查找另一个集合中不存在指针的文档,MongoDB的最佳体系结构是什么? 用例,mongodb,mongoose,Mongodb,Mongoose,这是一个科学博览会,评委们将登录平台,每个项目各得一分 我们正在努力解决的问题 法官想要访问URL,比如http://www.judge.com/next持续提供下一个尚未评分的项目,否则通知他们(因为所有项目都有该评委的评分)他们的评判职责已经完成 暗中射击 假设有三个集合,评委,项目和分数 judges: [{ _id name:String }] projects: [{ _id name:String }] scores: [{ _id type: enum
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 } } } )
- 示例结果(“具有
123评分的法官的下一个未评分项目”):\u id
- 这种方法使评委很容易获得“下一个项目”,但如果您想获得所有未分级的项目,则必须获取所有项目并在应用程序代码中过滤未分级的项目
- 由于每个评委都有自己的未评分项目列表,因此您也可以使用此方法将项目子集分配给评委
- 如果添加(或删除)项目,则必须更新所有文档
{ "scores" : [ { "project" : 4 } ] }