如何获取数组中所有元素的和

时间:2019-01-28 15:57:22

标签: mongodb sum mongodb-query aggregation-framework

好的,所以我有一个看起来像这样的对象集合:

{  
 "address":{  
  "building":"1007",
  "coord":[  
     -73.856077,
     40.848447
  ],
  "street":"Morris Park Ave",
  "zipcode":"10462"
},
"borough":"Bronx",
"cuisine":"Bakery",
"grades":[  
  {  
     "date":{  
        "$date":1393804800000
     },
     "grade":"A",
     "score":2
  },
  {  
     "date":{  
        "$date":1378857600000
     },
     "grade":"A",
     "score":6
  },
  {  
     "date":{  
        "$date":1358985600000
     },
     "grade":"A",
     "score":10
  },
  {  
     "date":{  
        "$date":1322006400000
     },
     "grade":"A",
     "score":9
  },
  {  
     "date":{  
        "$date":1299715200000
     },
     "grade":"B",
     "score":14
  }
],
"name":"Morris Park Bake Shop",
"restaurant_id":"30075445"
}

这只是这些元素的一个元素。例如,如何编写MongoDB查询,以便获得分数总和大于70的餐厅?

我是MongoDB的新手,很抱歉,如果重复该问题,但我没有找到有用的东西。

2 个答案:

答案 0 :(得分:2)

您可以使用$reduce来计算数组中的总和并将其放入$expr的内部,请尝试:

db.col.aggregate([
    {
        $match: {
            $expr: {
                $gte: [ 
                    { $reduce: { input: "$grades", initialValue: 0, in: { $add: [ "$$value", "$$this.score" ] } } }, 
                    70 
                ]
            }
        }
    }
])

答案 1 :(得分:1)

您可以使用聚合

db.collection.aggregate([
  { "$match": {
    "$expr": {
      "$gte": [ 
        { "$sum": "$grades.score" }, 
        70
      ]
    }
  }}
])

或使用查找查询

db.collection.find({
  "$expr": {
    "$gte": [ 
      { "$sum": "$grades.score" },
      70
    ]
  }
})