MongoDB 排序不适用于内部数组

MongoDB sorting does not work with inner array

我正在尝试查询文档中的特定字段并按其中一个字段对它们进行排序,但是,引擎似乎完全忽略了排序。

我使用查询:

     db.symbols.find({_id:'AAPL'}, {'income_statement.annual.totalRevenue':1,'income_statement.annual.fiscalDateEnding':1}).sort({'income_statement.annual.totalRevenue': 1})

这是输出:

    [
      {
        _id: 'AAPL',
        income_statement: {
          annual: [
            {
              fiscalDateEnding: '2021-09-30',
              totalRevenue: '363172000000'
            },
            {
              fiscalDateEnding: '2020-09-30',
              totalRevenue: '271642000000'
            },
            {
              fiscalDateEnding: '2019-09-30',
              totalRevenue: '256598000000'
            },
            {
              fiscalDateEnding: '2018-09-30',
              totalRevenue: '265595000000'
            },
            {
              fiscalDateEnding: '2017-09-30',
              totalRevenue: '229234000000'
            }
          ]
        }
      }
    ]

我希望条目按 fiscalDateEnding 排序,从 2017-09-30 升序开始。 但是,顺序是固定的,即使我用-1排序。

有什么想法吗?

您使用的 sort 用于对结果集中的文档进行排序。这与文档中数组元素的顺序不同。

对于您的情况,如果您使用的是较新版本的 MongoDB (5.2+),则可以使用 $sortArray.

db.symbols.aggregate([
  {
    $project: {
      _id: 1,
      annual: {
        $sortArray: {
          input: "$income_statement.annual",
          sortBy: {
            fiscalDateEnding: 1
          }
        }
      }
    }
  }
])

如果您使用的是旧版本 MongoDB,您可以执行以下操作来执行排序。

db.collection.aggregate([
  {
    "$unwind": "$income_statement.annual"
  },
  {
    $sort: {
      "income_statement.annual.fiscalDateEnding": 1
    }
  },
  {
    $group: {
      _id: "$_id",
      annual: {
        $push: "$income_statement.annual"
      }
    }
  },
  {
    "$project": {
      _id: 1,
      income_statement: {
        annual: "$annual"
      }
    }
  }
])

这里是Mongo Playground供大家参考。