SQL子查询到MongoDB

时间:2015-06-01 12:48:04

标签: mongodb subquery

我基本上来自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,我该如何实现?

2 个答案:

答案 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 } });