2016-02-16 56 views
1

以下是我在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

這看起來像一個簡單的[聚集](https://docs.mongodb.org/manual/aggregation/)與[ $基](https://docs.mongodb.org/manual/reference/operator/aggregation/group/)。 – Philipp

回答

1

在您的管道中使用具有三個運算符的聚合框架。第一步$match步驟作爲一個過濾器,只允許文檔進入滿足給定條件的流水線。此操作符與使用標準MongoDB查詢的方法類似,因此方法與find()方法類似。對於每個輸入文檔,輸出一個文檔(匹配)或零個文檔(不匹配)。這是您指定查詢以在日期範圍之間查找數據的位置。例如2009 -2011包括在內。在這種情況下,你可以使用$gte$lte運營商創建範圍查詢(所包括的範圍),並$gt$lt運營商的獨家範圍查詢。

第二$group步將集團由year場集合中的文件,這個密鑰成爲您的組_id。然後,studentGrades陣列由接收文檔表達式的運算符填充。

最後$project管道重塑通過與year領域和其他領域取代_id JEY文件字段保持不變。

所以,作爲一個結果,你正在尋找在聚集操作:

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 } 
    } 
]) 
+0

非常感謝您的回答。我如何查詢特定年份的數據。例如在上面的例子中,2008年到2011年。 – nzhmz

+0

@nzhmz在問題中最初沒有提出的問題中提出的其他問題在SO上被描繪爲一種壞習慣,因爲這對於一直前來的人來說是非常具有誤導性的,並且看到所提供的答案與您所問的答案不符。這裏的一般情況是一個問題一個答案。如果你可以編輯你的問題,我將會像其他人一樣樂意編輯我的答案來提供支持的要求。 – chridam

+0

有效點。用另外的問題編輯原始帖子。 – nzhmz