2014-01-24 82 views
0

假設我有下面的一組文件:MongoDB的 - 所有的數組元素的投影匹配查詢

{ "_id" : 1, "semester" : 1, "grades" : [ 70, 87, 90 ] } 
{ "_id" : 2, "semester" : 1, "grades" : [ 90, 88, 92 ] } 
{ "_id" : 3, "semester" : 1, "grades" : [ 85, 100, 90 ] } 
{ "_id" : 4, "semester" : 2, "grades" : [ 79, 85, 80 ] } 
{ "_id" : 5, "semester" : 2, "grades" : [ 88, 88, 92 ] } 
{ "_id" : 6, "semester" : 2, "grades" : [ 95, 90, 96 ] } 

我如何可以查詢到檢索包含等級大於80的文件,其中包括等級陣列只在查詢中匹配的項目?鑑於上面的例子,我想檢索以下結果集:

{ "_id" : 1, "semester" : 1, "grades" : [ 87, 90 ] } // 70 is missing 
{ "_id" : 2, "semester" : 1, "grades" : [ 90, 88, 92 ] } 
{ "_id" : 3, "semester" : 1, "grades" : [ 85, 100, 90 ] } 
{ "_id" : 4, "semester" : 2, "grades" : [ 85, 80 ] } // 79 is missing 
{ "_id" : 5, "semester" : 2, "grades" : [ 88, 88, 92 ] } 
{ "_id" : 6, "semester" : 2, "grades" : [ 95, 90, 96 ] } 

回答

2

可以使用做到這一點aggregation framework

db.collection.aggregate([ 
    { 
     // Emit a new document for each grade in the "grades" field 
     "$unwind" : "$grades" 
    }, 
    { 
     // Only emit documents whose "grades" field is at least 80 
     "$match" : { 
      "grades" : { 
       "$gte" : 80 
      } 
     } 
    }, 
    { 
     // Group documents back together by original _id 
     "$group" : { 
      "_id" : "$_id", 
      "semester": {$first: "$semester"}, 
      "grades" : { 
       "$push" : "$grades" 
      } 
     } 
    } 
]); 
+3

如果你有一個真正的大集合,你可能要考慮先做一場比賽以減少集合的大小,但你需要做第二場比賽。 – EmptyArsenal

+0

謝謝。如果我想將它用作map-reduce的查詢,它如何完成? – user49204

相關問題