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”中获取嵌套用户数据。

排序基于投票数和用户类型。如果答案具有相同的点赞数,则用户输入“专业”的答案将排在最前面。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...