如何解决Mongodb查询根据upvotes数组的长度对答案进行排序?
我正在尝试编写一个 Mongodb 查询来根据 upVotes 数组的长度对答案进行排序。有更多赞成票的答案应该排在第一位。任何人都可以帮我查询吗?
这是我的收藏对象:
{
"_id": {
"$oid": "607fcba8a6b6db2830060a2b"
},"userID": {
"$oid": "60782e1d4709d515c0684c45"
},"title": "que3","description": "text message","crowdID": "6042142f5a6e0d1d7e694534","userType": "Professional","answers": [
{
"_id": {
"$oid": "607fcbb5a6b6db2830060a2d"
},"userID": {
"$oid": "60782e004709d515c0684c44"
},"body": "que6","comments": [],"date": {
"$date": "2021-04-21T06:52:37.906Z"
},"upVotes": []
},{
"_id": {
"$oid": "607fcbb6a6b6db2830060a2f"
},"date": {
"$date": "2021-04-21T06:52:38.706Z"
},"upVotes": [
{
"_id": {
"$oid": "607fcbefa6b6db2830060a31"
},"userID": {
"$oid": "607933e4d281292298c99025"
},"date": {
"$date": "2021-04-21T06:53:35.115Z"
}
},{
"_id": {
"$oid": "607fcc01a6b6db2830060a33"
},"userID": {
"$oid": "60782e1d4709d515c0684c45"
},"date": {
"$date": "2021-04-21T06:53:53.641Z"
}
}
]
},{
"_id": {
"$oid": "607fcc14a6b6db2830060a35"
},"date": {
"$date": "2021-04-21T06:54:12.492Z"
},{
"_id": {
"$oid": "607fcc15a6b6db2830060a37"
},"date": {
"$date": "2021-04-21T06:54:13.149Z"
},"upVotes": []
}
],"date": {
"$date": "2021-04-21T06:52:24.964Z"
},"__v": 4
解决方法
最后在 mongo 中进行了 4 天的研究后,我创建了一个查询,可以根据需要对嵌套数据进行排序:
db.Question.aggregate([
{ "$match" : { "_id": ObjectId(req.params.questionId) }},{
$lookup: {
from: "users",localField: "userID",foreignField: "_id",as: "user_data"
}
},{ $unwind: { "path": "$answers","preserveNullAndEmptyArrays": true } },localField: "answers.userID",as: "answer_user_data"
}
},{ $unwind: { "path": "$answers.comments",localField: "answers.comments.userID",as: "comment_user_data"
}
},{
$project: {
_id : 1,title : 1,description:1,crowdId: 1,date:1,user_data: { "$arrayElemAt": [ "$user_data",0 ] },answers:
{
$cond:
{
if: { $gt : [ "$answers._id",0 ]},then: [{
_id: "$answers._id",body: "$answers.body",date: "$answers.date",upvotes_count: { $cond: { if: { $isArray: "$answers.upvotes" },then: { $size: "$answers.upvotes" },else: "0"} },user_data:{ "$arrayElemAt": [ "$answer_user_data",comments:
{
$cond:
{
if: { $gt : [ "$answers.comments._id",then: [{
_id: "$answers.comments._id",body: "$answers.comments._id",date: "$answers.comments._id",user_data:{ "$arrayElemAt": [ "$comment_user_data",}],else: []
}
}
}],else: []
}
}
}
},{
$sort : {
"answers.upvotes_count": -1,"answers.user_data.type": -1,}
},{
$group: {
_id: '$_id',"title": { "$first": "$title" },"description": { "$first": "$description" },"crowdId": { "$first": "$crowdId" },"date": { "$first": "$date" },"user_data": { "$first": "$user_data" },"answers": { "$push": { $first : "$answers"} },}
}
])
上述查询将根据每个答案对象中的赞成票对我的嵌套答案进行排序,并从问题、答案和评论中引用的嵌套“userId”中获取嵌套用户数据。
排序基于投票数和用户类型。如果答案具有相同的点赞数,则用户输入“专业”的答案将排在最前面。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。