如何在mongodb针脚的特定字段上匹配触发器?

时间:2019-06-18 08:29:37

标签: mongodb mongodb-stitch

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。

2 个答案:

答案 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"