gpt4 book ai didi

javascript - 根据嵌入文档的数量对记录进行排序

转载 作者:行者123 更新时间:2023-11-28 19:40:10 24 4
gpt4 key购买 nike

我正在使用mongodb和mongoose,并且我有一种情况,用户创建评级和评论,我想要的是获取评论具有最高票数的产品的评论。可以在 mongo 中实现吗?

结构是

{ "product" : ObjectId("53ccfa53b502542b2f463acd"),
"_id" : ObjectId("53e8675aea39355818ec4ab2"),
"vote" : [ ],
"review" : "Blah Blah Blah",
"stars" : 3,
"email" : "user@example.com", "__v" : 0 }

现在我想展示获得最多票数的评论,我知道如果在 find() 之后放置 sort() 和 limit() 函数,它可以通过同一文档级别上存在的字段来实现,但是我不知道如何在这种情况下处理多个记录“投票”....

最佳答案

您能做的最好的事情就是维护文档本身的“voteCount”。原因很快就会变得不言而喻。

您可以在数组中添加或删除成员时维护它。假设您正在使用 ObjectId 和 $push$pull更新运算符(operator)来执行此操作。所以你也你$inc使用一些查询逻辑来确保您不会重复投票的“User ObjectId”。假设模型名为“产品”:

Product.update(
{
"_id": ObjectId("53e8675aea39355818ec4ab2"),
"votes": { "$ne": ObjectId("53e87caaca37ffa384e5a931") }, // the user ObjectId
},
{
"$push": { "votes": ObjectId("53e87caaca37ffa384e5a931" }, // same Id
"$inc": { "voteCount": 1 }
},
function(err) {

}
);

并删除:

Product.update(
{
"_id": ObjectId("53e8675aea39355818ec4ab2"),
"votes": ObjectId("53e87caaca37ffa384e5a931"), // the user ObjectId
},
{
"$pull": { "votes": ObjectId("53e87caaca37ffa384e5a931" }, // same Id
"$inc": { "voteCount": -1 }
},
function(err) {

}
);

然后只需在字段上进行排序即可:

Product.find().sort({ "voteCount": -1 }).limit(1).exec(function(err,doc) {


});

但是,如果由于某种原因您认为不适合在文档中保留“voteCount”,那么您需要使用聚合框架手动“投影”它。要么使用 $size如果您有 MongoDB 2.6 或更高版本,则聚合方法:

Product.aggregate(
[
{ "$project": {
"product": 1,
"vote": 1,
"review": 1,
"stars": 1,
"email": 1,
"voteCount": { "$size": "$vote" }
}},
{ "$sort": { "voteCount": -1 } },
{ "$limit": 1 }
],
function(err,result) {

}
);

或者通过$unwind在数组上并通过 $sum 获取计数对于早期版本:

Product.aggregate(
[
{ "$unwind": "$vote"
{ "$group": {
"_id": "$_id",
"product": { "$first": "$product" },
"vote": { "$push": "$vote" },
"review": { "$first": "$review" },
"stars": { "$first": "$stars" },
"email": { "$first": "$email" },
"voteCount": { "$sum": 1 }
}},
{ "$sort": { "voteCount": -1 } },
{ "$limit": 1 }
],
function(err,result) {

}
);

聚合方法的实现确实没有多大意义,除非您确实需要除数组长度之外的其他计算。因此最好将其保留在文档中。

关于javascript - 根据嵌入文档的数量对记录进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25237887/

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