2014-04-03 16 views
6

Ho una raccolta di elementi che possono essere convertiti in up o in down.Come gestire la divisione per zero nel framework di aggregazione 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} 

Mi piacerebbe usare l'aggregazione per calcolare la qualità

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

Ovviamente questo non funziona, a causa della divisione per zero. Ho bisogno di attuare appropriato condizionata:

se upvotes = 0 e downvotes == 0 allora la qualità = upvotes se upvotes e downvotes sono entrambi 0, allora la qualità è 0

Ho provato modificando downvotes da 1 utilizzando! idioma ternario. Ma inutilmente.

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

Come è possibile integrare questo tipo di condizionamento all'interno del framework di aggregazione mongodb?

risposta

21

si potrebbe desiderare di utilizzare l'operatore $cond per gestire questa situazione:

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

Questo è quanto, ho appena cambiato "N/A" a "$ upvotes ". Ad ogni modo, $ cond è il mio problema ora. – gwaramadze

Problemi correlati