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.name
以priv_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
解决方案
这可能不那么通用,但会推动您朝着正确的方向前进。考虑使用运算符$mergeObjects
将priv_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"
}
}
推荐阅读
- jquery - jquery标签基于ID和鼠标移动移动拖拽重组
- swift - SECP256K1 使用 SawTooth Swift 进行验证
- spring - Spring Data REST javax.persistence.RollbackException:提交事务时出错
- xslt - XSLT 用给定的参数转换给定的查询
- .net - vb.net 将文件复制到文件夹(每个文件夹 80 个文件)
- javascript - 如何在复杂模式中设置状态
- java - 带有重音符号(变音符号)的文件夹中的 Java 安装
- reactjs - React:播放,暂停点击功能
- javascript - 我已经使用 clear timeout 功能在一段时间后删除了它的 udage,这样当我再次在空字符串上单击 Add ToDo 时,它会显示消息
- android - 让交易被拒绝出售交易