【问题标题】:Querying and grouping in mongoDb?在mongoDb中查询和分组?
【发布时间】:2011-07-15 20:44:51
【问题描述】:

第 1 部分:

我有(学生)收藏:

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

我试图从中只获取两个密钥:

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

所以我需要消除年龄和 gpa 只有 name 和 studentId ,我该怎么做?

第 2 部分:

然后我有'主题'集合:

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

我需要将之前的键(在第 1 部分)与正确的 studentId 匹配/组合,所以我最终会得到这样的结果:

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

 }

我该怎么做?这是获得结果的正确思考方式吗?我试图阅读有关 group 和 mapReduce 的信息,但没有找到明确的示例。

【问题讨论】:

    标签: mongodb mapreduce grouping nosql


    【解决方案1】:

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

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

    其中的第一个 {} 是限制查询,在这种情况下包括整个集合。后半部分使用 1 或 0 指定键,具体取决于您是否希望它们返回。不要在单个查询中混合包含和排除。除了一些特殊情况,mongo 是不会接受的。

    你的第二个问题更难。您要求的是加入,而 mongo 不支持。没有办法连接 studentId 上的两个集合。您需要找到所有想要的学生,然后使用这些学生 ID 来查找所有匹配的科目。然后,您需要将这两个结果合并到您自己的代码中。您可以通过您使用的任何驱动程序来执行此操作,或者您可以在 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”查询。如果数据确实经常更改,您需要在代码中动态合并。

    另一个可能更好的选择是将“主题”数据包含在“学生”集合中,反之亦然。这将导致对 mongodb 更友好的结构。如果您经常遇到这种加入问题,mongo 可能不是最佳选择,而关系数据库可能更适合您的需求。

    【讨论】:

    • 您还可以使用$in operator 来减少生成out 表所需的查询数。这在高负载或通过网络查询时尤其重要,因为往返时间可能成为大量学生的一个因素。
    【解决方案2】:

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

    查看文档中的Field Selection 了解更多信息。你可以这样做:

    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" }, ... ]
    }
    

    【讨论】:

      猜你喜欢
      • 2015-10-09
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2018-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      相关资源
      最近更新 更多