mongodb - Mongodb 聚合管道对嵌套数组对象值进行排序

标签 mongodb sorting mongodb-query aggregation-framework aggregation

我有具有以下结构的 mongo 文档:

{
    name: 'AKL to DUD Via CHC',
    rates: [
        {
            container_id: 'abc',
            buyRate: 380
        },
        {
            container_id: 'def',
            buyRate: 410
        }
    ]
}
{
    name: 'AKL to DUD',
    rates: [
        {
            container_id: 'abc',
            buyRate: 400
        },
        {
            container_id: 'def',
            buyRate: 420
        }
    ]
}

我希望根据特定 container_idbuyRate 在聚合管道中进行排序,例如如果我传入 abccontainer_id,我想对 abcbuyRate 进行排序,以便 (在这种情况下)首先返回第二个文档。

我可以通过添加一个字段来使其工作,其中的费率由container_id过滤,然后对其进行排序,但它似乎过于复杂:

db.services.aggregate([
    { $addFields: { "containerBuyRate":
            { $filter: {
                input: "$rates",
                as: "rate",
                cond: { $eq: [ "$$rate.container_id", "abc") ] }
            }}
     }},
     { $sort: {'containerBuyRate.buyRate': -1}}
])

有没有更简洁的方法来实现这一点?

最佳答案

你的方法很好。

另一种方式:

Difference is $addFields will add one more field as an object.

Working example.

db.getCollection('Example').aggregate([
  { $addFields: {
    containerBuyRate: {$arrayElemAt: [ "$rates", { $indexOfArray: [ "$rates.container_id", "abc" ] } ] }}
  },
  { $sort: {'containerBuyRate.buyRate': -1}}
])

输出:

[
  {
    "_id": ObjectId("5a934e000102030405000002"),
    "containerBuyRate": {
      "buyRate": 405,
      "container_id": "abc"
    },
    "name": "AKL to DUD Via CHC",
    "rates": [
      {
        "buyRate": 405,
        "container_id": "abc"
      },
      {
        "buyRate": 500,
        "container_id": "def"
      }
    ]
  },
  {
    "_id": ObjectId("5a934e000102030405000001"),
    "containerBuyRate": {
      "buyRate": 400,
      "container_id": "abc"
    },
    "name": "AKL to DUD",
    "rates": [
      {
        "buyRate": 400,
        "container_id": "abc"
      },
      {
        "buyRate": 420,
        "container_id": "def"
      }
    ]
  },
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "containerBuyRate": {
      "buyRate": 380,
      "container_id": "abc"
    },
    "name": "AKL to DUD Via CHC",
    "rates": [
      {
        "buyRate": 380,
        "container_id": "abc"
      },
      {
        "buyRate": 410,
        "container_id": "def"
      }
    ]
  },
  {
    "_id": ObjectId("5a934e000102030405000003"),
    "containerBuyRate": {
      "buyRate": 300,
      "container_id": "abc"
    },
    "name": "AKL to DUD Via CHC",
    "rates": [
      {
        "buyRate": 300,
        "container_id": "abc"
      },
      {
        "buyRate": 700,
        "container_id": "def"
      }
    ]
  },
  {
    "_id": ObjectId("5a934e000102030405000004"),
    "containerBuyRate": {
      "buyRate": 100,
      "container_id": "abc"
    },
    "name": "AKL to DUD Via CHC",
    "rates": [
      {
        "buyRate": 1000,
        "container_id": "def"
      },
      {
        "buyRate": 100,
        "container_id": "abc"
      }
    ]
  }
]

谢谢@Alex 指出我在上一个解决方案上的错误。

关于mongodb - Mongodb 聚合管道对嵌套数组对象值进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57584525/

相关文章:

regex - 展开对象数组 mongoDB

xslt - 如何在xslt中按十六进制排序?

mongodb - 如何在 mongodb 中使用查找来匹配数组字段?

ios - MongoDB 与 Firebase

javascript - node.js上传下载pdf文件

java - 计算 String 出现次数并按它们排序的简单方法

php - 如何按字母顺序对目录内容进行排序,子目录出现在普通文件之前?

node.js - Mongoose 聚合 : return not _id field

javascript - 在更新 mongodb 时设置动态键

node.js - 无法在 NodeJS 中使用 Mongoose 和 Typescript 扩展基类