2016-07-21 43 views
1

所以我有这样的事情在我的数据库:某些记录之前获得MongoDB中的所有记录的总和

{ "_id" : ObjectId("561c2ca2153678d113d03077"), "title" : "Level 8", "rewardCoins" : NumberLong(25)} 
{ "_id" : ObjectId("5615980b153678d113d02d61"), "title" : "Level 9", "rewardCoins" : NumberLong(40)} 
{ "_id" : ObjectId("56159796153678d113d02d60"), "title" : "Level 10", "rewardCoins" : NumberLong(55)} 
{ "_id" : ObjectId("5613f5ad153678d113d01f4a"), "title" : "Level 11", "rewardCoins" : NumberLong(70)} 

所以我想获得在“11级” 这总应该都是rewardCoins的总和是55 + 40 + 25 = 120

我想知道我怎么能得到这与蒙戈壳?

我尝试类似:

db.userlevels.aggregate([ 
    { 
     $match: { 
     "title": {$lt: "Level 11"} 
     }, 
    }, 
    { 
     $group: { 
      "_id": {"name": "Level 11"}, 
      "totalAmount": { $sum: "$rewardCoins"} 
     } 
    } 
]) 

但我没有得到什么我'期待...... 提示或解决方案将非常感激。谢谢。

+1

你将不会得到准确的结果与字符串比较。如果您可以将数值存储在数字字段中,那么最好使用上述模式,否则您的过滤器查询将起作用,'$ match'管道只会将具有“Level 10”的文档管道传输到下一个管道,因为比较字符串逻辑“(”Level 9“<”Level 10“)是错误的。 – chridam

+0

如果我将它与对象标识(_id)@chridman相匹配,这可以工作吗? – Splendid

回答

2

考虑引入额外的数字字段只存储级别:

{ "_id" : ObjectId("561c2ca2153678d113d03077"), "title" : "Level 8", "rewardCoins" : NumberLong(25), level: 8} 
{ "_id" : ObjectId("5615980b153678d113d02d61"), "title" : "Level 9", "rewardCoins" : NumberLong(40), level: 9} 
{ "_id" : ObjectId("56159796153678d113d02d60"), "title" : "Level 10", "rewardCoins" : NumberLong(55), level: 10} 
{ "_id" : ObjectId("5613f5ad153678d113d01f4a"), "title" : "Level 11", "rewardCoins" : NumberLong(70), level: 11} 

拥有它作为标题的一部分,然后比较字符串是有点怪。然后这个聚合查询应该做的工作:

​​
相关问题