首页 > 解决方案 > 通过匹配 mongodb 中的相似值来合并数组

问题描述

这是以下问题的扩展。

在 mongodb 中过滤数组

我有一个集合,其中每个文档包含 2 个数组,如下所示。

{
  users:[
    {
      id:1,
      name:"A"
    },
    {
      id:2,
      name:"B"
    },
    {
      id:3,
      name:"C"
    }
  ]
  priv_users:[
    {
      name:"X12/A",
      priv:"foobar"
    },
    {
      name:"Y34.B",
      priv:"foo"
    }
  ]
}

从链接的问题中,我学会了使用$map合并 2 个文档数组。但我想不出匹配users.namepriv_users.name获得低于输出。

{
  users:[
    {
      id:1,
      name:"A",
      priv:"foobar"
    },
    {
      id:2,
      name:"B",
      priv:"foo"
    },
    {
      id:3,
      name:"C"
    }
  ]
}

users.name并且priv_users.name没有一致的模式,但users.name存在于priv_users.name. MongoDB 版本是 4.0

标签: mongodbmongodb-queryaggregation-framework

解决方案


这可能不那么通用,但会推动您朝着正确的方向前进。考虑使用运算符$mergeObjectspriv_users​​数组中过滤的文档与用户中的文档合并。过滤采用$substr名称priv_users字段的 并将其与users名称字段进行比较。生成的管道将如下所示

db.collection.aggregate([
    { '$addFields': { 
        'users': {
            '$map': {
                'input': '$users',
                'in': {
                    '$mergeObjects': [
                        {
                            '$arrayElemAt': [
                                {
                                    '$filter': {
                                        'input': '$priv_users',
                                        'as': 'usr',
                                        'cond': {
                                            '$eq': [
                                                '$$this.name',
                                                { '$substr': [ 
                                                  '$$usr.name', 4, -1 
                                                ] }
                                            ]
                                        }
                                    }
                                },
                                0
                            ]
                        },                        
                        '$$this'
                    ]
                }
            }
        }
    } }
])

如果使用 MongoDB 4.2 和更新版本,请考虑使用运算符将​​名称字段与用户名称字段$regexMatch匹配为正则表达式模式。priv_users您的$cond运算符现在变为:

'cond': {
    '$regexMatch': { 
        'input': '$$usr.name', 
        'regex': '$$this.name', 
        'options': "i" 
    }
}

推荐阅读