配置数据库触发器时,我在数据库触发器匹配表达式中的 $or 选择器在第二级嵌套中不起作用
My $or selector in a database trigger match expression doesn't work at the second level of nesting when configuring a database trigger
Update:我使用“$match 表达式”来描述这个,但我实际上并没有使用 $match 运算符。根据文档,选择器应符合 $match 的语法,尽管 $match 关键字在实际表达式中显然不是必需的。
更新2:实际集合中,outerField
代表message
,fieldA
代表fansNo
,fieldB
代表sharedNo
。所以outerField.fieldA
代表message.fansNo
,outerField.fieldB
代表message.sharedNo
。这是触发器触发时 updateDescription
字段的字符串化表示(即当我在匹配表达式中仅指定 updateDescription.updatedField
时):
"updateDescription: {\"removedFields\":[],\"updatedFields\":{\"someOtherField\":310,\"message.fansNo\":1,\"updatedAt\":\"2020-06-22T13:29:08.829Z\"}}"
============================================= ===================
原文post:
所以我无法理解为什么当我在匹配表达式中指定message.fansNo
和message.sharedNo
时它无法触发。
我正在设置一个 database trigger on updates to a collection, but I'm not able to get my $match
表达式来过滤导致触发器触发的更改事件。我只想在存在 2 个嵌套字段中的一个或两个时触发触发器,比如 fieldA
和 fieldB
。这2个字段嵌套在一个对象中,对象是每个文档中一个字段的值。像这样:
// CollectionA schema
{
_id: ...,
outerField: {
fieldA: 1 // or any number
fieldB: 2 // or any number
},
...
}
我尝试使用下面的 $match 表达式,但触发器没有触发:
{
"$or": [
{
"updateDescription.updatedFields.outerField.fieldA": {"$exists":true}
},
{
"updateDescription.updatedFields.outerField.fieldB":{"$exists":true}
}
]
}
如果我删除 outerField.<field>
,它会起作用。即:
{
"$or": [
{
"updateDescription.updatedFields": {"$exists":true}
},
{
"updateDescription.updatedFields":{"$exists":true}
}
]
}
但这当然对我没有用,因为触发器会在任何更新时触发。
我会提供一个演示,但我不确定如何创建一个配置了数据库触发器的示例。
任何帮助将不胜感激,谢谢!
所以我能够通过更改查询来监视同时更新但未嵌套的字段来解决此问题。我认为检查嵌套字段的问题在于 ChangeEvent
的 updateDescription
属性 不包含已更改的实际嵌套对象;相反,它包含更改的点符号表示。因此,如果您在我的 post 中查看 Update 2,您会看到 updatedFields
具有此值:{\"someOtherField\":310,\"message.fansNo\":1...
而不是 {\"someOtherField\":310,\"message\":{\"fansNo\":1...
.通过在 $match 查询中使用 message.fansNo
,Mongo 将查找此对象形状:{\"message\":{\"fansNo\":1...
,在本例中不匹配。这里的“真正”解决方案可能是在我的匹配表达式中转义 message.fansNo
中的 .
,但我无法让它工作(参见 this thread)。
所以对我有用的“解决方案”实际上只是一种适用于我的特定用例的解决方法:碰巧 someOtherField
总是与 message.fansNo
一起更新,并且 someOtherField
没有嵌套。所以我可以匹配 someOtherField
而不必担心嵌套。基本上这个匹配表达式给了我想要的结果:
{
"$or": [
{
"updateDescription.updatedFields.someOtherField": {"$exists":true}
},
{
"updateDescription.updatedFields.someOtherField":{"$exists":true}
}
]
}
希望这对其他人有帮助!
Update:我使用“$match 表达式”来描述这个,但我实际上并没有使用 $match 运算符。根据文档,选择器应符合 $match 的语法,尽管 $match 关键字在实际表达式中显然不是必需的。
更新2:实际集合中,outerField
代表message
,fieldA
代表fansNo
,fieldB
代表sharedNo
。所以outerField.fieldA
代表message.fansNo
,outerField.fieldB
代表message.sharedNo
。这是触发器触发时 updateDescription
字段的字符串化表示(即当我在匹配表达式中仅指定 updateDescription.updatedField
时):
"updateDescription: {\"removedFields\":[],\"updatedFields\":{\"someOtherField\":310,\"message.fansNo\":1,\"updatedAt\":\"2020-06-22T13:29:08.829Z\"}}"
============================================= ===================
原文post:
所以我无法理解为什么当我在匹配表达式中指定message.fansNo
和message.sharedNo
时它无法触发。
我正在设置一个 database trigger on updates to a collection, but I'm not able to get my $match
表达式来过滤导致触发器触发的更改事件。我只想在存在 2 个嵌套字段中的一个或两个时触发触发器,比如 fieldA
和 fieldB
。这2个字段嵌套在一个对象中,对象是每个文档中一个字段的值。像这样:
// CollectionA schema
{
_id: ...,
outerField: {
fieldA: 1 // or any number
fieldB: 2 // or any number
},
...
}
我尝试使用下面的 $match 表达式,但触发器没有触发:
{
"$or": [
{
"updateDescription.updatedFields.outerField.fieldA": {"$exists":true}
},
{
"updateDescription.updatedFields.outerField.fieldB":{"$exists":true}
}
]
}
如果我删除 outerField.<field>
,它会起作用。即:
{
"$or": [
{
"updateDescription.updatedFields": {"$exists":true}
},
{
"updateDescription.updatedFields":{"$exists":true}
}
]
}
但这当然对我没有用,因为触发器会在任何更新时触发。
我会提供一个演示,但我不确定如何创建一个配置了数据库触发器的示例。 任何帮助将不胜感激,谢谢!
所以我能够通过更改查询来监视同时更新但未嵌套的字段来解决此问题。我认为检查嵌套字段的问题在于 ChangeEvent
的 updateDescription
属性 不包含已更改的实际嵌套对象;相反,它包含更改的点符号表示。因此,如果您在我的 post 中查看 Update 2,您会看到 updatedFields
具有此值:{\"someOtherField\":310,\"message.fansNo\":1...
而不是 {\"someOtherField\":310,\"message\":{\"fansNo\":1...
.通过在 $match 查询中使用 message.fansNo
,Mongo 将查找此对象形状:{\"message\":{\"fansNo\":1...
,在本例中不匹配。这里的“真正”解决方案可能是在我的匹配表达式中转义 message.fansNo
中的 .
,但我无法让它工作(参见 this thread)。
所以对我有用的“解决方案”实际上只是一种适用于我的特定用例的解决方法:碰巧 someOtherField
总是与 message.fansNo
一起更新,并且 someOtherField
没有嵌套。所以我可以匹配 someOtherField
而不必担心嵌套。基本上这个匹配表达式给了我想要的结果:
{
"$or": [
{
"updateDescription.updatedFields.someOtherField": {"$exists":true}
},
{
"updateDescription.updatedFields.someOtherField":{"$exists":true}
}
]
}
希望这对其他人有帮助!