mongodb 如何按字符串的一部分分组?

mo49yndu  于 2022-12-03  发布在  Go
关注(0)|答案(2)|浏览(176)

我在MongoDB中有这个数据。

{ _id: "abc*hello*today*123", "value": 123 },
{ _id: "abc*hello*today*999", "value": 999 },
{ _id: "xyz*hello*tomorrow*123", "value": 123 }

我想要的是按“*{number}"之前的第一部分分组。这就是我想要实现的:

{
    _id: "abc*hello*today",
    results: [
        { _id: "abc*hello*today*123", "value": 123 },
        { _id: "abc*hello*today*999", "value": 999 }
    ]
},
{
    _id: "xyz*hello*tomorrow",
    results: [
        { _id: "xyz*hello*tomorrow*123", "value": 123 }
    ]
}

我试过这个:

{
  $group:{
      "_id":"$_id".slice(0, -4)
  }
}
tag5nh1u

tag5nh1u1#

您可以使用regex,如下所示:

.*(?=\*\d+)

上面的正则表达式将匹配并检索 * 和数字之前的值。
Demo @ Regex 101

  1. $set-设置firstPart字段。
    1.1. $getField-从对象 1.1.1 取得match值。
    1.1.1. $regexFind-将_id与正则表达式匹配。
  2. $group-按firstPart分组。
  3. $unset-移除results.firstPart字段。
db.collection.aggregate([
  {
    $set: {
      firstPart: {
        $getField: {
          field: "match",
          input: {
            $regexFind: {
              input: "$_id",
              regex: ".*(?=\\*\\d+)"
            }
          }
        }
      }
    }
  },
  {
    $group: {
      _id: "$firstPart",
      results: {
        $push: "$$ROOT"
      }
    }
  },
  {
    $unset: "results.firstPart"
  }
])

Demo @ Mongo Playground

qjp7pelc

qjp7pelc2#

**替代解决方案:**如果您的_id始终具有相同的(field1*field2*field3*numbers),则可以使用$split + $slice + $reduce运算符

解释:

第一个
MongoPlayground

相关问题