如何使用MongoDB中的2个字段的总和进行排序

时间:2018-02-14 12:11:46

标签: node.js mongodb express aggregation-framework

我有这个文件:

{ 
 "_id": "59b804e1ee8a4071a5ea3fcc",
 "description" : "description",
 "imagepath" : "https://example.com",
 "type" : "label",
 "downvotes" : -25,
 "upvotes" : 15, 
 "language" : "en", 
 "approoved" : true
},
{ 
 "_id": "59b804e1ee8a4071a5ea4dfd",
 "description" : "description",
 "imagepath" : "https://example.com",
 "type" : "label",
 "downvotes" : 0,
 "upvotes" : 30, 
 "language" : "en", 
 "approoved" : true
}

如何按upvotes&的总和对这2个对象进行排序downvotes值?

(身份59b804e1ee8a4071a5ea4dfd的对象应首先出现,依此类推)

我试图与

汇总
{"$group" : {
    _id:{upvotes:"$upvotes",downvotes:"$downvotes"}, 
    count:{$sum:1}
}} 

但它将所有类似文件分组。我无法弄清楚聚合过程/语法。

编辑:根据Veeram的回答,这里是使用mongoose的工作代码,万一有人放在这里:

Labels.aggregate([
        {"$addFields":{ "sort_order":{"$add":["$upvotes", "$downvotes"]}}},
        {"$sort":{"sort_order":-1}},
        {"$project":{"sort_order":0}}
    ]).exec(function (err, labels) {
        if (err) {
            return res.status(404).json({
                error: err
            });
        }
        res.status(200).json(labels);
    });

2 个答案:

答案 0 :(得分:3)

您可以在每个文档中创建一个新字段,表示upvotes和downvotes的总和。然后在这个新领域对文档进行排序:

db.collection.aggregate([
  { $addFields: { "votes": { $sum: [ "$downvotes", "$upvotes"] } } },
  { $sort: { "votes": -1 } }
])

答案 1 :(得分:3)

您可以在3.4中尝试以下聚合进行自定义排序。

使用$add$addFields中的upvotes和downvotes求和,以将计算值保留为文档中的额外字段,然后按$sort排序字段。

$project,但要排除排序字段以获得预期的输出。

db.col.aggregate([
 {"$addFields":{ "sort_order":{"$add":["$upvotes", "$downvotes"]}}}, 
 {"$sort":{"sort_order":-1}},
 {"$project":{"sort_order":0}}
])