如何根据数组的成员对集合进行排序

Posted

技术标签:

【中文标题】如何根据数组的成员对集合进行排序【英文标题】: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

【问题讨论】:

【参考方案1】:

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

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

Playground

【讨论】:

以上是关于如何根据数组的成员对集合进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MongoDB 中对集合记录中的数组进行排序?

如何根据相关对象集合的属性对 Core Data 结果进行排序?

在 MDX 中对集合的成员进行排序

如何根据3个项目对Dart集合进行排序?

如何对List集合中的对象进行排序?

根据另一个集合项目对项目进行排序