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

3
Mongo游乐场链接: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中是否有排序选项?

谢谢


2
如果我们可以获得样本数据和输出的JSON文档格式,而不是表格格式,会非常有帮助。 - ray
我使用表格格式是因为我认为这样更容易解释。只需将列视为JSON格式中的字段即可。 "bot_msg"字段内部有一个数组。 - João Vitor Gomes
2
不,我们需要JSON文档才能在诸如Mongo playground之类的工具中重现问题。 - ray
1
问题不够清晰,如果您选择1,那么3,7如何出现在预期结果中,请像@ray所说的那样使用mongo playground,并发布示例文档和预期结果。 - varman
好的,谢谢大家。我会按照你们的要求重新表述问题。 - João Vitor Gomes
我按照你的要求重新表述了问题! - João Vitor Gomes
1个回答

3

$sortArray 适用于 MongoDB 5.2 版本及更高版本,如果您收到此错误消息,则可能使用的是旧版本。

无论您使用的是哪个版本,最好的方法都是在 $push 之前先进行 $sort

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

如果你已经有了一个数组(且无法控制推送操作),并且你的版本早于5.2,你可以使用$unwind

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

playground


1
很好,我在写完问题后想出了相同的解决方案,但我保留了该问题以供未来的程序员参考。干得好。 - João Vitor Gomes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接