2014-04-03 9 views
6

Ich habe eine Sammlung von Elementen, die Upvoted oder Downvoted werden können.Wie behandelt man Division durch Null in MongoDB Aggregation Framework

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

Ich möchte Aggregation verwenden, um die Qualität

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

Offensichtlich berechnen dies nicht funktioniert, weil die Division durch Null. Ich muss entsprechende Konditionierung implementieren:

wenn upvotes = 0 und downvotes == 0, dann ist die Qualität = upvotes wenn upvotes und beide sind 0 downvotes dann die Qualität ist 0

Ich versuchte downvotes von 1 Tweaking mit! ternäres Idiom. Aber ohne Erfolg.

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}} 
]); 

Wie kann ich diese Art von Konditionierung in mongodb aggregation framework integrieren?

Antwort

21

Sie könnten den $cond Operator verwenden möchten damit umgehen:

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

Das ist es, ich "N/A" nur auf „$ upvotes ". Wie auch immer, $ Cond ist jetzt mein Freund. – gwaramadze

Verwandte Themen