2016-11-15 40 views
2

比方说,我有我的总管道的文件,看起来像这样:

{ 
    scores: [ 
    {type: 'quiz', score: 75}, 
    {type: 'quiz', score: 62}, 
    {type: 'final', score: 34}, 
    ] 
} 

我使用$project改造它,我想获得的测验分数的总和,是有我可以以某种方式链接我的$filter$sum

我知道我可以使用两个$project s,但现在我的管道设置的方式会迫使我继续在我的第二个项目中重新投影一吨密钥,这是我想避免的。

回答

1

是的!

db.collection.aggregate([ 
    { "$project": { 
     "totalQuiz": { 
      "$sum": { 
       "$filter": { 
        "input": "$score", 
        "as": "s", 
        "cond": { "$eq": [ "$$s.type", "quiz" ] } 
       } 
      } 
     } 
    } 
]) 
+0

我想$过滤器会返回一个数组和$总和将不考虑数组求和 –

+1

@Parshuram OP正在使用MongoDB 3.2检查[发布说明](https://docs.mongodb.com/manual/release-notes/3.2/#accumulator-expression-availability)。 – styvane

+0

哦,但作者使用什么版本? –

2

您将需要从其他运营商即嵌入文档的得分映射到值,你可以$sum阵列的帮助。你可以这样做,使用$map操作,如下:

db.test.aggregate([ 
    { 
     "$project": { 
      "scores": 1, 
      "quiz_total": { 
       "$sum": { 
        "$map": { 
         "input": "$scores", 
         "as": "item", 
         "in": { 
          "$cond": [ 
           { "$eq": [ "$$item.type", "quiz" ] }, 
           "$$item.score", 
           0 
          ] 
         } 
        } 
       }     
      }  
     } 
    } 
]) 

样本输出

{ 
    "_id" : ObjectId("582ac9619602e37d2794acd3"), 
    "scores" : [ 
     { 
      "type" : "quiz", 
      "score" : 75 
     }, 
     { 
      "type" : "quiz", 
      "score" : 62 
     }, 
     { 
      "type" : "final", 
      "score" : 34 
     } 
    ], 
    "quiz_total" : 137 
} 
+0

感谢您的回答。虽然Styvane的答案是我询问的文档的更直接的解决方案,但即使在score数组中存在其他数值(即我的情况),您的解决方案也能正常工作。 –

相关问题