微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Mongodb查询根据upvotes数组的长度对答案进行排序?

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?