如何在MongoDB聚合框架中处理除零

gwa*_*dze 13 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}
Run Code Online (Sandbox Code Playgroud)

我想用聚合来计算质量

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

显然这不起作用,因为除以零.我需要实施适当的调节:

如果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}}
]);
Run Code Online (Sandbox Code Playgroud)

如何在mongodb聚合框架中集成这种条件?

Ana*_*lan 35

您可能希望使用$ cond运算符来处理此问题:

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

  • 就是这样,我只是将“ N / A”更改为“ $ upvotes”。无论如何,$ cond现在是我的主意。 (2认同)

Wil*_*ver 7

你想要$ cond运算符. http://docs.mongodb.org/manual/reference/operator/aggregation/cond/

就像是:

{"$project":
  {
    "name": "$name",
    "upvotes": "$upvotes",
    "downvotes": { $cond: [ { $eq: ["$downvotes", 0] }, 1, "$downvotes"] } 
  }
},
Run Code Online (Sandbox Code Playgroud)