如何使用MongoDB聚合框架获取最后一个子字符串?

Gia*_* P. 2 mongodb aggregation-framework

假设我有这些文件

> db.coll.find().toArray()
[
    {
        "_id" : ObjectId("5a36c3e218948d0722457078"),
        "locality" : "Nasimi, Baku, Azerbaijan"
    },
    {
        "_id" : ObjectId("5a36c3e218948d0722457079"),
        "locality" : "Garland, TX, USA"
    },
    {
        "_id" : ObjectId("5a36c3e218948d072245707a"),
        "locality" : "Halytskyi District, Lviv, Lviv Oblast, Ukraine"
    },
    {
        "_id" : ObjectId("5a36c3e218948d072245707b"),
        "locality" : "Tozeur, Tunisia"
    }
]
Run Code Online (Sandbox Code Playgroud)

我只想获取国家/地区,即最后一个逗号 ( ', ') 之后的内容。

例如

[
    "Azerbaijan",
    "USA",
    "Ukraine",
    "Tunisia"
]
Run Code Online (Sandbox Code Playgroud)

我已经设法获取第一个逗号的索引及其后的内容,但我不知道如何获取最后一个逗号。

[
    "Azerbaijan",
    "USA",
    "Ukraine",
    "Tunisia"
]
Run Code Online (Sandbox Code Playgroud)

这是可行的,但它会将所有结果加载到 JavaScript Mongo Shell 的内存中,但如果可以使用单个 MongoDB 聚合命令来完成,那就更理想了。

db.coll
  .aggregate([
    {
      $project: {
        lastIndexOf: { $indexOfBytes: [ '$locality', ', ' ] },
        locality: '$locality',
      }
    },
    {
      $project: {
        lastIndexOfPlusTwo: { $add: [ '$lastIndexOf', 2 ] },
        locality: '$locality',
      }
    },
    {
      $project: { country: { $substr: [ '$locality', '$lastIndexOfPlusTwo', -1 ] } }
    }
  ]).pretty()

{
    "_id" : ObjectId("5a36c3e218948d0722457078"),
    "country" : "Baku, Azerbaijan"
}
{
    "_id" : ObjectId("5a36c3e218948d0722457079"),
    "country" : "TX, USA"
}
{
    "_id" : ObjectId("5a36c3e218948d072245707a"),
    "country" : "Lviv, Lviv Oblast, Ukraine"
}
{
    "_id" : ObjectId("5a36c3e218948d072245707b"),
    "country" : "Tunisia"
}
Run Code Online (Sandbox Code Playgroud)

也许用$let$split

use*_*814 5

您可以尝试下面的聚合查询。

{"$arrayElemAt":["$$locality",-1]}访问数组中的最后一个元素。

db.coll.aggregate([{"$project":{
  "_id":0,
  "last":{
    "$let":{
      "vars":{"locality":{"$split":["$locality",","]}},
      "in":{"$arrayElemAt":["$$locality",-1]}
    }
  }
}}])
Run Code Online (Sandbox Code Playgroud)