mongoDb中的查询和分组



第一部分:

I have (student) collection:

 {
    sname : "",
    studentId: "123"
    age: "",
    gpa: "",
 }

我试图从中只获得两个键:

{
    sname : "",
    studentId: "123"
}

所以我需要消除年龄和gpa只有名字和学生编号,我怎么能做到这一点?

第二部分:

然后我有'subject'集合:

{
    subjectName : "Math"
    studentId : "123"
    teacherName: ""
 }

我需要匹配/组合前面的键(在part1中)与正确的studentId,所以我最终会得到这样的东西:

 {
    sname : "",
    studentId: "123",
    subjectName : "Math" 
 }

我怎么能做到这一点,这是正确的方式来思考得到的结果?我试着阅读关于组和mapReduce,但我没有找到一个明确的例子。

回答你的第一个问题,你可以这样做:

db.student.find({}, {"sname":1, "studentId":1});

其中的第一个{}是限制查询,在本例中包括整个集合。后半部分指定带有1或0的键,这取决于您是否想要返回它们。但是,不要在单个查询中混合包含和排除。除少数特殊情况外,蒙古不接受。

你的第二个问题更难。你要求的是一个连接,而mongo不支持这个。没有办法连接studentId上的两个集合。您需要找到您想要的所有学生,然后使用这些studentid找到所有匹配的科目。然后,您需要在自己的代码中合并这两个结果。你可以通过你使用的任何驱动程序来实现,或者你可以在shell本身的javascript中实现,但无论哪种方式,你都必须将它们与你自己的代码合并。

编辑:下面是一个示例,说明如何在shell中执行此操作,并将输出输出到一个名为"out"的集合。

db.student.find({}, {"sname":1, "studentId":1}).forEach(
  function (st) {
    db.subject.find({"studentId":st.studentId}, {"subjectName":1}).forEach(
      function (sub) {
        db.out.insert({"sname":st.sname, "studentId":st.studentId, "subjectName":sub.subjectName});
      }
    );
  }
);

如果这不是经常更改的数据,您可以删除"out"集合,并定期使用此shell脚本重新填充它。然后你的代码可以直接从"out"进行查询。如果数据经常更改,您将希望在代码中动态地进行合并。

另一个可能更好的选择是将"subject"数据包含在"student"集合中,反之亦然。这将产生一个更加mongodb友好的结构。如果您经常遇到这种连接问题,mongo可能不是最好的选择,关系数据库可能更适合您的需求。

Mongo的find()运算符允许您从结果中包含或排除某些字段

查看文档中的字段选择以获取更多信息。你可以这样做:

db.users.find({}, { 'sname': 1, 'studentId': 1 });
db.users.find({}, { 'age': 0, 'gpa': 0 });

要将学生和科目联系在一起,您可以分别查找学生的科目,如下所示:

db.subjects.find({ studentId: 123 });

或者在每个学生中嵌入主题数据,并将其与学生文档一起检索:

{
    sname : "Roland Browning",
    studentId: "123"
    age: 14,
    gpa: "B",
    subjects: [ { name : "French", teacher: "Mr Bronson" }, ... ]
}

相关内容

  • 没有找到相关文章

最新更新