2016-08-21 185 views
0

鉴于集合中的以下项目,如何获得所有记录的id == 1的assessment.answer字段的平均值?此外,我需要返回subs []的第一个索引与每个记录像subs [0]Mongo DB在集合的子字段上获得平均值

{ 
    "_id" : ObjectId("57b5e55e8426706357a90728"), 
    "updatedAt" : ISODate("2016-08-20T00:21:16.497Z"), 
    "createdAt" : ISODate("2016-08-18T16:42:06.173Z"), 
    "password" : "password", 
    "email" : "[email protected]", 
    "lastName" : "User", 
    "firstName" : "Test", 
    "assessment" : [ 
     { 
      "subs" : [ 
       100, 
       100, 
       100, 
       100, 
       100 
      ], 
      "answer" : 2, 
      "id" : 1 
     }, 
     { 
      "subs" : [ 
       80, 
       40, 
       100, 
       60, 
       20 
      ], 
      "answer" : 2, 
      "id" : 2 
     }, 
     { 
      "subs" : [ 
       80, 
       20, 
       20, 
       20, 
       20 
      ], 
      "answer" : 4, 
      "id" : 3 
     }, 
     { 
      "subs" : [ 
       80, 
       100, 
       60, 
       100, 
       100 
      ], 
      "answer" : 5, 
      "id" : 4 
     }, 
     { 
      "subs" : [ 
       60, 
       100, 
       100, 
       100, 
       100 
      ], 
      "answer" : 1, 
      "id" : 5 
     }, 
     { 
      "subs" : [ 
       100, 
       100, 
       100, 
       100, 
       100 
      ], 
      "answer" : 3, 
      "id" : 6 
     }, 
     { 
      "subs" : [ 
       80, 
       20, 
       100, 
       80, 
       60 
      ], 
      "answer" : 3, 
      "id" : 7 
     }, 
     { 
      "subs" : [ 
       20, 
       20, 
       20, 
       20, 
       20 
      ], 
      "answer" : 4, 
      "id" : 8 
     }, 
     { 
      "subs" : [ 
       60, 
       60, 
       60, 
       60, 
       40 
      ], 
      "answer" : 5, 
      "id" : 9 
     }, 
     { 
      "subs" : [ 
       60, 
       60, 
       60, 
       60, 
       40 
      ], 
      "answer" : 3, 
      "id" : 10 
     }, 
     { 
      "subs" : [ 
       100, 
       100, 
       100, 
       100, 
       100 
      ], 
      "answer" : 4, 
      "id" : 11 
     }, 
     { 
      "subs" : [ 
       80, 
       80, 
       80, 
       80, 
       80 
      ], 
      "answer" : 1, 
      "id" : 12 
     }, 
     { 
      "subs" : [ 
       60, 
       60, 
       60, 
       60, 
       60 
      ], 
      "answer" : 2, 
      "id" : 13 
     }, 
     { 
      "subs" : [ 
       40, 
       40, 
       40, 
       40, 
       40 
      ], 
      "answer" : 3, 
      "id" : 14 
     }, 
     { 
      "subs" : [ 
       80, 
       20, 
       20, 
       20, 
       100 
      ], 
      "answer" : 3, 
      "id" : 15 
     } 
    ], 
    "__v" : 51 
} 
+0

什么是你的MongoDB服务器的版本? – styvane

+0

该版本是3.0.7 –

+0

请看更新的问题... –

回答

0

你几乎在那里。您需要选择只有$match$in

var ids = [ 1, 2, 3, 4, 5 ]; 
var matchStage = { "$match": { "assessment.id": { "$in": ids } } }; 

db.accounts.aggregate(
    [ 
     matchStage, 
     { "$unwind": "$assessment" }, 
     matchStage, 
     { "$group": { 
      "_id": null, 
      "avg": { "$avg": "$assessment.answer" } 
     }} 
    ] 
) 

从MongoDB的3.2启动符合您的条件的文件,你可以做这样的:

db.accounts.aggregate(
    [ 
     matchStage, 
     { "$project": { 
      "preAvg": { 
       "$avg": { 
        "$map": { 
         "input": { 
          "$filter": { 
           "input": "$assessment", 
           "as": "el", 
           "cond": { "$setIsSubset": [ [ "$$el.id" ], ids ] } 
          } 
         }, 
         "as": "val", 
         "in": "$$val.answer" 
        } 
       } 
      } 
     }}, 
     { "$group": { 
      "_id": null, 
      "avg": { "$sum": "$preAvg" } 
     }} 
    ] 
) 
+0

例如,我希望看到所有评估为1的地方。然后,对于每个记录,选择subs数组中每个索引的平均值。所以如果2个人有答案id = 1,那么显示和平均subs [0]为这些用户。如果每个分别选择1和4,我应该看到2 –