2014-04-03 38 views
6

我有一个项目的集合可以upvoted或downvoted。如何在MongoDB汇总框架中处理零除

{"_id" : 1, "name": "foo", "upvotes" : 30, "downvotes" : 10} 
{"_id" : 2, "name": "bar", "upvotes" : 20, "downvotes" : 0} 
{"_id" : 3, "name": "baz", "upvotes" : 0, "downvotes" : 0} 

我想用零来使用聚合计算质量

db.items.aggregate([ 
    {"$project": 
     { 
      "name": "$name", 
      "upvotes": "$upvotes" 
      "downvotes": "$downvotes", 
      "quality": {"$divide":["$upvotes", "$downvotes"]} 
     } 
    }, 
    {"$sort": {"quality":-1}} 
]); 

显然,这是不行的,因为分工。我需要实现适当的调节:

如果upvotes = 0和downvotes == 0则质量= upvotes 如果upvotes和downvotes均为0,那么质量是0

我试图调整downvotes 1使用!三元成语。但无济于事。

db.items.aggregate([ 
    {"$project": 
     { 
      "name": "$name", 
      "upvotes": "$upvotes", 
      "downvotes": "$downvotes" ? "$downvotes": 1 
     } 
    }, 
    {"$project": 
     { 
      "name": "$name", 
      "upvotes": "$upvotes" 
      "downvotes": "$downvotes", 
      "quality": {"$divide":["$upvotes", "$downvotes"]} 
     } 
    }, 
    {"$sort": {"quality":-1}} 
]); 

如何在mongodb聚合框架中集成这种调节?

回答

21

您可能需要使用$cond操作者处理这个问题:

db.items.aggregate([ 
    {"$project": 
     { 
      "name": "$name", 
      "upvotes": "$upvotes", 
      "downvotes": "$downvotes", 
      "quality": { $cond: [ { $eq: [ "$downvotes", 0 ] }, "N/A", {"$divide":["$upvotes", "$downvotes"]} ] } 
     } 
    }, 
    {"$sort": {"quality":-1}} 
]); 
+1

这是它,我只是改变了 “N/A” 到“$ upvotes ”。无论如何,$ cond现在是我的朋友。 – gwaramadze