【问题标题】:Preserve the database output sort in dataweave在 dataweave 中保留数据库输出排序
【发布时间】:2020-07-02 13:17:11
【问题描述】:

我有一个要求,希望数据编织输出按特定顺序。

这是我必须处理的数据库输出

[
  {
    "order": "Order 2",
    "inv": 6150579.00000,
    "dio": 31,
    "week": "2020-06-01T00:00:00"
  },
  {
    "order": "Order 2",
    "inv": 6318049.21000,
    "dio": 33,
    "week": "2020-06-08T00:00:00"
  },
  {
    "order": "Order 1",
    "inv": 6306077.76000,
    "dio": 45,
    "week": "2020-06-01T00:00:00"
  },
  {
    "order": "Order 1",
    "inv": 6047050.75000,
    "dio": 43,
    "week": "2020-06-08T00:00:00"
  },
]

在数据库查询中,我编写了条件,以便按照特定的订单条件对其进行排序。在这种情况下,例如订单“12345 - 订单 1”必须在输出中排在第一位。

但是当我使用 groupBy 条件转换 dataweave 中的输出时,排序顺序发生了变化

payload map {

       "order" : $.order,
       "inv" : $.inv,
       "dio" : $.dio,
       "week" : $.week
} groupBy $.order

输出:

{
  "Order 1": [
    {
      "order": "Order 1",
      "inv": 6306077.76000,
      "dio": 45,
      "week": "2020-06-01T00:00:00"
    },
    {
      "order": "Order 1",
      "inv": 6047050.75000,
      "dio": 43,
      "week": "2020-06-08T00:00:00"
    }
  ],
  "Order 2": [
    {
      "order": "Order 2",
      "inv": 6150579.00000,
      "dio": 31,
      "week": "2020-06-01T00:00:00"
    },
    {
      "order": "Order 2",
      "inv": 6318049.21000,
      "dio": 33,
      "week": "2020-06-08T00:00:00"
    }
  ]
}

您会看到 Order 1 值排在第一位。

这是我编造的一个例子。实际上我有数百个数据。 在这种情况下,使用 orderBy $$ 也是错误的。

【问题讨论】:

  • 让我重申您的目标:您想按order 分组,然后按inv 排序,对吗?如果是这样,那么首先进行分组并遍历对象以对各个数组进行排序。

标签: mule mule-studio dataweave mulesoft mule-esb


【解决方案1】:

groupBy() 不保证任何排序。如果没有明确提及,您不应假设任何操作都会保留顺序。您必须明确订购输出:

%dw 2.0
output application/json
---
payload map {

       "order" : $.order,
       "inv" : $.inv,
       "dio" : $.dio,
       "week" : $.week
} groupBy $.order 
mapObject (($$): $ orderBy -$.inv ) // order inside each group by inv descending order
orderBy $$ // order the groups by key

更新:基于 cmets,我已更改脚本以通过 inv 属性以相反的顺序对每个组进行排序。

更新 2:我还按键排序了每个组,因此“订单 1”高于“订单 2”。

输出:

{
  "Order 1": [
    {
      "order": "Order 1",
      "inv": 6306077.76000,
      "dio": 45,
      "week": "2020-06-01T00:00:00"
    },
    {
      "order": "Order 1",
      "inv": 6047050.75000,
      "dio": 43,
      "week": "2020-06-08T00:00:00"
    }
  ],
  "Order 2": [
    {
      "order": "Order 2",
      "inv": 6318049.21000,
      "dio": 33,
      "week": "2020-06-08T00:00:00"
    },
    {
      "order": "Order 2",
      "inv": 6150579.00000,
      "dio": 31,
      "week": "2020-06-01T00:00:00"
    }
  ]
}

【讨论】:

  • 我以为有人会这么说。我已经提到 orderBy $$ 不起作用。所以我修改了这个问题。我不是根据订单价值进行排序的。它是根据 sql 查询中“inv”的值完成的。所以订单值将基于我必须分组并发送到前端的条件。
  • 具体的顺序是什么?每组内的顺序按inv?
  • 我已经更新了答案。如果我理解正确,请告诉我。
  • 我也修正了团体的顺序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 2020-03-11
  • 1970-01-01
  • 2023-03-24
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多