我基本上来自SQL Server域,现在正在学习MongoDB。我想为以下场景转换为MongoDB本机查询。
我有两张表[Marks], [Student Details]
:
[Marks] 表格具有以下结构:
StudentID Varchar(10),
Marks Int
[学生明细] 表格如下:
StudentID Varchar(10),
StudentName Varchar(50),
Age Int,
Address Varchar(500).
现在我想要使用以下SQL查询检索获得高分的前5名学生。
Select * From [StudentDetails]
where StudentID in (Select Top 5 StudentID from [Marks] order by Marks Desc)
我想将此查询转换为MongoDB,我该如何实现?
答案 0 :(得分:0)
考虑使用具有以下架构的文档创建单个集合(例如student),例如:
{
"studentId": "7402B",
"name": "foo",
"age": 19,
"address": "1 abc street",
"marks": 78
}
要获得获得高分的前5名学生,将会是:
db.student.find().sort({ "marks": -1 }).limit(5)
sort()
方法指定查询返回匹配文档的顺序,其中值-1指定降序排序。然后limit()
游标方法指定光标将返回的最大文档数,在上面只返回前5个。
如果您有两个单独的集合,那么您将需要两个查询,一个使用光标的map()
方法从标记集合中获取学生ID,然后使用该学生返回文档的另一个查询来自学生系列的ID:
var studentIds = db.marks.find()
.sort({"marks": -1})
.limit(5)
.map(fuction (doc){ return doc.studentId; });
db.students.find({ "studentId": { "$in": studentIds }});
答案 1 :(得分:0)
我相信你不能在一个查询中做到这一点,但我可以帮助你制定其他策略。
var topmarks = db.Marks.find({ "marks" : -1 }).limit(5).toArray();
db.student.find({ "studentId" : { "$in" : topmarks } });