mongodb的绣花应用程序上的$ match表达式不能正常工作。
我正在尝试建立一个仅适用于集合中一个字段的简单更新触发器。
触发器设置提供了$ match聚合,看起来很简单,可以进行设置。
例如,如果我希望仅在指定集合中的“在线”字段设置为“真”时才触发触发器,我会这样做:
{"updateDescription.updatedFields":{"online":"true"}}
与针脚触发器相同的是:
{$match:{{updateDescription.updatedFields:{online:"true"}}}
问题是当我尝试匹配作为对象的字段的更新时(例如hours:{online:40,offline:120}
由于某些原因,$ exists或$ in不起作用 这样做:
{"updateDescription.updatedFields":{"hours":{"$exists":true}}
不起作用,也不起作用:
{"updateDescription.updatedFields":{"hours.online":{"$exists":true}}
触发器的$ match应该像正常的mongo $ match一样工作。 他们只是提供了一个示例:
{
"updateDescription.updatedFields": {
"status": "blocked"
}
}
示例从这里: https://docs.mongodb.com/stitch/triggers/database-triggers/
我尝试了100多种变体,但我似乎无法理解
如果匹配是特定值,例如:
,则触发器工作正常 {"updateDescription.updatedFields":{"hours.online":{"$numberInt\":"20"}}
然后在数据库中将hours.online设置为20。
答案 0 :(得分:1)
我自己为此付出了很多努力,试图在某个嵌套字段更新为 any 值(而不只是一个特定的值)时触发触发器。
问题似乎与更改流如何报告更新的字段有关。
借助信誉并感谢MongoDB的支持,我终于可以将此作为潜在的解决方案,至少在较简单的情况下如此:
{
"$expr": {
"$not": {
"$cmp": [{
"$let": {
"vars": { "updated": { "$objectToArray": "$updateDescription.updatedFields" } },
"in": { "$arrayElemAt": [ "$$updated.k", 0 ] }
}},
"example.subdocument.nested_field"
]
}
}
}
当然用您自己的点符号字段路径替换example.subdocument.nested_field
。
答案 1 :(得分:0)
我可以使用显式$expr
运算符使它匹配项,或者将其声明为单个字段而不是嵌入式对象。即。 "updateDescription.updatedFields.statue": "blocked"