$sortArray 按布尔条件排序

问题描述 投票:0回答:1

我有一个这样的收藏:

[
  {
    "name": "Banana",
    "variants": [
      {
        "color": "blue",
        "props": []
      },
      {
        "color": "green",
        "props": [
          {
            "uid": 1,
            "grade": 3
          },
          {
            "uid": 3,
            "grade": 2
          }
        ]
      }
    ]
  }
]

对于查询结果中的每个文档,

variants
数组应按条件“props为空”与“props不为空”排序,首先列出包含props的变体。在示例中,颜色为
green
的变体应该位于第一个,因为它有 props,其次是颜色为
blue
的变体,因为它不包含任何 props。

期望的结果:

[
  {
    "name": "Banana",
    "variants": [
      {
        "color": "green",
        "props": [
          {
            "grade": 3,
            "uid": 1
          },
          {
            "grade": 2,
            "uid": 3
          }
        ]
      },
      {
        "color": "blue",
        "props": []
      }
    ]
  }
]

在文档中只有按文档字段和排序方向排序的示例,不幸的是我没有看到按自定义评估排序的选项。

感谢您的帮助!

mongodb aggregation-framework
1个回答
0
投票

在执行

length
之前,您可以通过向
variants
数组中的每个对象添加
$sortArray
字段来定义排序标准。

然后删除

variants.length
字段。

db.collection.aggregate([
  {
    $set: {
      variants: {
        $sortArray: {
          input: {
            $map: {
              input: "$variants",
              in: {
                $mergeObjects: [
                  "$$this",
                  {
                    length: {
                      $size: "$$this.props"
                    }
                  }
                ]
              }
            }
          },
          sortBy: {
            length: -1
          }
        }
      }
    }
  },
  {
    $unset: [
      "variants.length"
    ]
  }
])

演示@Mongo Playground

© www.soinside.com 2019 - 2024. All rights reserved.