Mongo 触发器 - 数组中所有项目的匹配表达式

问题描述 投票:0回答:1

我有一个 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"
                                        ]
                                    }
                                ]
                            }
                        }
                    }
                }
            }
        ]
    }
}
mongodb triggers
1个回答
0
投票

我会通过组合过滤数组的 $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 大小 - 任何比这更长的内容都是不匹配的,因此第一场比赛就足够了。

© www.soinside.com 2019 - 2024. All rights reserved.