gpt4 book ai didi

javascript - 按数组大小对结果排序

转载 作者:可可西里 更新时间:2023-11-01 09:35:39 25 4
gpt4 key购买 nike

我有一个名为 article 的集合,我需要根据它包含的数组的大小对返回的对象进行排序。做这个的最好方式是什么?我想到的一个是检索整个对象列表并在 JS 中手动对其进行排序。但我一次返回 10 篇文章,因此每次调用此 API 时,它都必须执行不必要的数组排序工作。

Article.find({})
.limit(10)
.skip(req.params.page*10)
//Something like using $project to make a new variable called votecount that counts objects in a given array.
.sort({votecount:-1})
.exec(function(err,arts){
articleObj.articles = arts;
if (arts.length<10){
articleObj.reachedEnd = true;
}
res.json(articleObj);
});

我需要统计票数。这是一个示例对象:

{
"_id" : ObjectId("55f50cfddcf1ad6931fb8dd4"),
"timestamp" : "2015-09-13T00:58:57-5:00",
"url" : "http://www.nytimes.com/2015/09/13/sports/floyd-mayweather-finishes-bout-and-maybe-his-career-with-lopsided-win-over-andre-berto.html",
"abstract" : "Mayweather’s victory by unanimous decision gave him a record of 49-0, the same as the legendary heavyweight Rocky Marciano.",
"title" : "Mayweather Wins Easily in What He Calls Last Bout",
"section" : "Sports",
"comments" : [ ],
"votes" : {
"up" : [
ObjectId("55e5e16934d355d61c471e48")
],
"down" : [ ]
},
"image" : {
"caption" : "Floyd Mayweather Jr. after learning he defeated Andre Berto in a unanimous decision.",
"url" : "http://static01.nyt.com/images/2015/09/14/sports/13fight/13fight-mediumThreeByTwo210.jpg"
},
"__v" : 0
}

最佳答案

您需要 .aggregate()方法,因为所有“排序”参数必须是文档中存在的字段,这样您就可以“转换”$size将数组放入文档中进行排序:

Article.aggregate(
[
{ "$project": {
"timestamp": 1,
"url": 1,
"abstract": 1,
"title": 1,
"section": 1,
"comments": 1,
"votes": 1,
"image": 1,
"voteCount": {
"$subtract": [
{ "$size": "$votes.up" },
{ "$size": "$votes.down" }
]
}
}},
{ "$sort": { "voteCount": -1 } },
{ "$skip": req.params.page*10 },
{ "$limit": 10 },
],
function(err,results) {
// results here
}
);

当然这是有代价的,因为您需要在每次迭代时都计算大小。因此,更好的做法是在每次更新操作时将投票的“计数”保留在文档中,使用 Bulk Operations 也更好。适合所有情况:

var bulk = Atricle.collection.intializeOrderedBulkOp();

// Swap out a downvote where present
bulk.find({
"_id": id,
"votes.up": { "$ne": userId },
"votes.down": userId
}).updateOne({
"$push": { "votes.up": userId },
"$pull": { "votes.down": userId }
"$inc": { "voteCount": 2 }
});

// Add an upvote where not present
bulk.find({
"_id": id,
"votes.up": { "$ne": userId },
"votes.down": { "$ne": userId }
}).updateOne({
"$push": { "votes.up": userId },
"$inc": { "voteCount": 1 }
});

bulk.execute(function(err,response) {
// maybe do something here
});

当然,“否决票”是这个过程的逆过程。

这里的要点是,在处理每张选票时,“计数”或“分数”会同时保持更新。这允许正常的查询和排序,而不需要在每次访问数据时都进行计算,因为它已经完成了。

后一种情况是处理此问题的最高效方法。

关于javascript - 按数组大小对结果排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33029782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com