我有一个 mongo 触发器,在插入/更新某个表时将事件发送到 AWS Eventbridge。
我需要排除 2 个字段来触发触发器,因为当我的工作人员将项目添加到第 3 方系统,然后使用新系统的 ID 更新表时,这会导致无限循环,从而无休止地触发对表的更新.
我下面的规则适用于 1 个项目,但我无法弄清楚如何动态查看“SubCategories”数组内的所有“项目级别”。这只会忽略列表中第 0 个项目的更新,而且我有一些项目的类别多达 300 个,所以我不能一遍又一遍地硬编码 0,1,2,3。我尝试的每一次尝试都失败了,或者抛出无效表达式的错误。
{
"$and": [
{
"updateDescription.updatedFields.SubCategories.1.jumpsellerSubCategoryId": {
"$exists": false
}
},
{
"updateDescription.updatedFields.jumpsellerCategoryId": {
"$exists": false
}
}
]
}
我尝试用
$
替换数组深度 0,1,2 等,这似乎是 mongo 中的有效表达式,但过滤器根本不起作用。
经过多次挖掘后的解决方案:
{
"$expr": {
"$and": [
{
"$not": {
"$anyElementTrue": {
"$map": {
"input": {
"$cond": {
"if": {
"$isArray": {
"$objectToArray": "$updateDescription.updatedFields"
}
},
"then": {
"$objectToArray": "$updateDescription.updatedFields"
},
"else": []
}
},
"as": "field",
"in": {
"$and": [
{
"$regexMatch": {
"input": "$$field.k",
"regex": "^SubCategories\\.\\d+\\.jumpsellerSubCategoryId$"
}
},
{
"$eq": [
{
"$type": "$$field.v"
},
"int"
]
}
]
}
}
}
}
},
{
"$not": {
"$anyElementTrue": {
"$map": {
"input": {
"$cond": {
"if": {
"$isArray": {
"$objectToArray": "$updateDescription.updatedFields"
}
},
"then": {
"$objectToArray": "$updateDescription.updatedFields"
},
"else": []
}
},
"as": "field",
"in": {
"$and": [
{
"$eq": [
"$$field.k",
"jumpsellerCategoryId"
]
},
{
"$eq": [
{
"$type": "$$field.v"
},
"int"
]
}
]
}
}
}
}
}
]
}
}
我会通过组合过滤数组的 $filter 和 $size 来简化它:
[
{
"$match": {
"$expr": {
"$eq": [
{
"$size": {
"$filter": {
"input": {
"$objectToArray": "$updateDescription.updatedFields"
},
"as": "aField",
"cond": {
"$regexMatch": {
"input": "$$aField.k",
"regex": "\\.jumpsellerCategoryId$"
}
},
"limit": 1
}
}
},
0
]
}
}
}
]
正则表达式条件在任何深度都匹配
jumpsellerCategoryId
,这应该涵盖 $ 和条件。 limit
是在第一场比赛后停止的优化,因为 $eq 检查 0 大小 - 任何比这更长的内容都是不匹配的,因此第一场比赛就足够了。