2014-01-24 84 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

相关问题