我有这个文件:
{
"_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);
});
答案 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}}
])