如何对 MongoDB 中的嵌套数组进行排序?

How to sort nested array in MongoDB?

Mongo游乐场link:https://mongoplayground.net/p/BGtxQEBAvZh

我有一个数组字段“opcoes”,我想按日期排序 dt。目前它是未排序的,例如

{
    "_id" : "w900c9b5a-666f-4857-92da-0b9c273dca40",
    "opcoes" : [
        {
            "dt" : ISODate("2021-11-16T11:17:55.386-03:00"),
            "text" : "2"
        },
        {
            "dt" : ISODate("2021-11-16T11:17:29.709-03:00"),
            "text" : "3"
        }
    ]
}

预期结果是:

{
    "_id" : "w900c9b5a-666f-4857-92da-0b9c273dca40",
    "opcoes" : [
        {
            "dt" : ISODate("2021-11-16T11:17:29.709-03:00") ,
            "text" : "3"
        },
        {
            "dt" : , ISODate("2021-11-16T11:17:55.386-03:00")
            "text" : "2"
        }
    ]
}

你能帮帮我吗?我试图使用 $SortArray 但它无法识别它。我得到“ Invalid $project :: caused by :: Unknown expression $sortArray ”。

我使用 $push 创建了数组:

{ 
    $group: { 
        _id: "$chat_key", 
        opcoes: { 
            $push: { 
                text: "$text", 
                dt: "$dt" 
            } 
        } 
    } 
}

是否有在 $push 中排序的选项?

谢谢

$sortArray 适用于 mongoDB version 5.2 及更高版本,如果出现此错误,您可能使用的是旧版本。

无论您的版本如何,最好的方法是在 $push:

之前 $sort
db.collection.aggregate([
  {
    $sort: {dt: 1}
  },
  {
    $group: { 
    _id: "$chat_key", 
    opcoes: {$push: {text: "$text", dt: "$dt"}} 
  }
])

如果你已经有了一个数组(而且你无法控制push操作),并且你的版本低于5.2,你可以$unwind:

db.collection.aggregate([
  {
    $unwind: "$opcoes"
  },
  {
    $sort: {dt: 1}
  },
  {
    $group: {
      _id: "$_id",
      opcoes: {
        $push: {dt: "$opcoes.dt", text: "$opcoes.text"}
      }
    }
  }
])

playground