在mongodb中将数据作为嵌套文档进行检索

时间:2016-02-16 13:19:23

标签: node.js mongodb

以下是我在mongodb集合中的一组示例数据。

{year : 2010 , studentName: "John", grades :{science: 70, maths: 80, english: 85 }}
{year : 2010 , studentName: "Denver", grades :{science: 75, maths: 85, english: 85 }}
{year : 2010 , studentName: "Harry", grades :{science: 85, maths: 75, english: 65 }}
{year : 2011 , studentName: "John", grades :{science: 70, maths: 80, english: 85 }}
{year : 2011 , studentName: "Denver", grades :{science: 75, maths: 85, english: 85 }}
{year : 2011 , studentName: "Harry", grades :{science: 85, maths: 75, english: 65 }}

我想使用嵌套文档检索数据作为下面的架构。

[{
  "year": 2010,
  "studentGrades": [
    {
      "studentName": "John",
      "grades": {
        "science": 70,
        "maths": 80,
        "english": 85
      }
    },
    {
      "studentName": "Denver",
      "grades": {
        "science": 75,
        "maths": 85,
        "english": 85
      }
    }
  ]
},
{
  "year": 2011,
  "studentGrades": [
    {
      "studentName": "John",
      "grades": {
        "science": 70,
        "maths": 80,
        "english": 85
      }
    },
    {
      "studentName": "Denver",
      "grades": {
        "science": 75,
        "maths": 85,
        "english": 85
      }
    }
  ]
}
]

是否可以帮我编写mongodb query命令以获取日期范围之间的数据,例如: year之间的2009 -2011,结果是上述格式?

1 个答案:

答案 0 :(得分:1)

将聚合框架与具有三个运算符的管道一起使用。第一个 $match 步骤作为过滤器,仅允许文档进入满足给定条件的管道。此运算符类似于 find() 方法,因为它使用标准的MongoDB查询。对于每个输入文档,输出一个文档(匹配)或零文档(不匹配)。您可以在此处指定查询以查找日期范围之间的数据。例如在2009 -2011之间的年份。在这种情况下,您可以使用 $gte $lte 运算符来创建范围查询(针对包含范围)和 {{ 3}} 使用 $gt 运算符进行独占范围查询。

第二个 $lt 步骤会将year字段中的文档分组,此密钥将成为您的论坛_id。然后, $group 运算符会填充studentGrades数组,该运算符会接收文档表达式。

最终的 $push 管道通过将_id jey替换为year字段来重新整理文档字段,而其他字段保持不变。

因此,您正在寻找以下聚合操作:

db.students.aggregate([
    { "$match": { "year": { "$gte": 2009, "$lte": 2011 } } },
    {
        "$group": {
            "_id": "$year",
            "studentGrades": {
                "$push": {
                    "studentName": "$studentName",
                    "grades": "$grades"
                }
            }
        }
    },
    {
        "$project": { "_id": 0, "year": "$_id", "studentGrades": 1 }
    }
])