【问题标题】:How to sort a collection based on a member of array如何根据数组的成员对集合进行排序
【发布时间】:2021-12-10 08:21:23
【问题描述】:

我需要根据价格对文档进行排序,价格是一个数组,而我们根据键 PRICE_A、PRICE_B 或 PRICE_C 对价格进行排序。 样本数据:

[
  {
    "_id": 1,
    "price": [
      {
        "PRICE_A": 3098.67
      },
      {
        "PRICE_B": 3166.67
      },
      {
        "PRICE_C": 3800
      }
    ]
  },
  {
    "_id": 2,
    "price": [
      {
        "PRICE_A": 679.6
      },
      {
        "PRICE_B": 781.6
      },
      {
        "PRICE_C": 938
      }
    ]
  }
]

预期输出:按 PRICE_A 升序排列

[
   {
      "_id":2,
      "price":[
         {
            "PRICE_A":679.6
         },
         {
            "PRICE_B":781.6
         },
         {
            "PRICE_C":938
         }
      ]
   },
   {
      "_id":1,
      "price":[
         {
            "PRICE_A":3098.67
         },
         {
            "PRICE_B":3166.67
         },
         {
            "PRICE_C":3800
         }
      ]
   }
]

我正在使用这个查询- https://mongoplayground.net/p/Ajaw4SFVpzg

【问题讨论】:

    标签: mongodb mongoose mongodb-query aggregation-framework spring-data-mongodb


    【解决方案1】:

    没有直接的方法可以做到这一点,您需要改进架构设计,否则此查询会影响性能,

    • $addFields 创建一个新的自定义字段p
    • $arrayElemAt 通过传递它的键名来获取第一个价格值,这里你必须传递你的动态价格键名
    • $sort p 按升序排列
    • $unset 删除 p 键,因为现在不需要它
      {
        "$addFields": {
          "p": { "$arrayElemAt": ["$price.PRICE_A", 0] }
        }
      },
      { "$sort": { "p": 1 } },
      { "$unset": "p" }
    

    Playground

    【讨论】:

      猜你喜欢
      • 2014-08-29
      • 2018-03-05
      • 1970-01-01
      • 2020-04-24
      • 2015-06-26
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      相关资源
      最近更新 更多