mongodb - 在 mongodb 中对推送的数组进行排序

标签 mongodb mongoose aggregation-framework

我有一个这样的 mongodb 结果。

[
  {
    "_id": {
      "_id": "57174838afb8eb97ccd409ca",
      "name": "Yet another position",
      "description": "description",
      "code": "11Y-WK"
    },
    "votes": [
      {
        "candidate": {
          "_id": "56f19694e84a6bf1b66ad378",
          "surname": "EBIMOBOERE",
          "firstName": "BLESSING",
          "middleName": "OGIONWO",
          "othername": " BAZIGHA OGIONWO",
          "sc_number": "071050"
        },
        "count": 3
      },
      {
        "candidate": {
          "_id": "56f19690e84a6bf1b66aa558",
          "surname": "OIWO",
          "othername": "PETER ODION",
          "sc_number": "034837"
        },
        "count": 2
      },
      {
        "candidate": {
          "_id": "56f19690e84a6bf1b66aa2f3",
          "surname": "FASHOLA",
          "othername": "OLUFUNKE JUMOKE",
          "sc_number": "008243"
        },
        "count": 4
      }
    ],
    "total_count": 9
  },
  {
    "_id": {
      "_id": "571747a8afb8eb97ccd409c7",
      "name": "Test Position",
      "description": "Description",
      "code": "10T-9K"
    },
    "votes": [
      {
        "candidate": {
          "_id": "56f19690e84a6bf1b66aa3b7",
          "surname": "ASAKA",
          "othername": "ISAAC",
          "sc_number": "044660"
        },
        "count": 1
      },
      {
        "candidate": {
          "_id": "56f19690e84a6bf1b66aa6ea",
          "surname": "ADEYEMI",
          "othername": "OLUWAFUNMILZYO",
          "sc_number": "062444"
        },
        "count": 5
      },
      {
        "candidate": {
          "_id": "56f1968fe84a6bf1b66aa03e",
          "surname": "OGWOR",
          "othername": "JAMES",
          "sc_number": "042357"
        },
        "count": 3
      }
    ],
    "total_count": 9
  }
]

我需要按 count 排序按降序排列。

下面是返回上述结果的查询。
我试过在所有阶段应用排序,但没有运气。
  Vote.aggregate([
{ "$match": { "_poll" : mongoose.mongo.ObjectID(req.query._poll) } },
{
  "$group": {
    "_id": {
      "_position": '$_position',
      "candidate": '$candidate'
    },
    "voteCount": { "$sum": 1 }
  }
},
{
  "$group": {
    "_id": "$_id._position",
    "votes": {
      "$push": {
        "candidate": "$_id.candidate",
        "count": "$voteCount"
      }
    },
    "total_count": { "$sum": "$voteCount" }
  }
},
{ "$sort": { "total_count": -1 } }

我需要插入排序操作的地方,以降序按计数排序。

最佳答案

在聚合期间对数组进行排序是一件有点棘手的事情。
所以我要解决的问题是:

  • 展开阵列
  • 申请排序
  • 重组阵列

  • 请找到 mongo shell 代码,该代码将概述此技术:
    var group = {$group:{_id:"$type", votes:{$push:"$value" }}}
    var unwind={$unwind:"$votes"}
    var sort = {$sort:{"votes":-1}}
    var reGroup = {$group:{_id:"$_id", votes:{$push:"$votes" }}}
    db.readings.aggregate([group,unwind,sort ,reGroup])
    

    欢迎任何评论!

    关于mongodb - 在 mongodb 中对推送的数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37541012/

    相关文章:

    javascript - 访问 Mongoose 查询结果

    javascript - 如何更新数组中的对象详细信息?

    node.js - 如何使用另一个集合 Mongoose 查找子查询文档

    MongoDB 聚合多个对象

    javascript - bson的javascript/javascriptwithscope类型有什么用

    node.js - NodeJs中如何使用多线程?

    javascript - 将 helper 应用于所有集合 mongodb/meteor

    node.js - 排序和限制导致带有回调的查询

    python - 使用 pymongo 3.0 从 mongo 聚合中获取结果

    node.js - MongoDB 中两个集合的 $aggregation、$sum