以下是我在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
,结果是上述格式?
答案 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 }
}
])