2

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。

4

2 回答 2

2

我能够通过使用显式$expr运算符来匹配项目,或者将其声明为单个字段而不是嵌入对象。IE。"updateDescription.updatedFields.statue": "blocked"

于 2019-10-29T15:14:20.310 回答
2

我自己为此苦苦挣扎,试图在某个嵌套字段更新为任何值(而不仅仅是一个特定值)时触发触发器。

该问题似乎与更改流如何报告更新的字段有关。

归功于 MongoDB 的支持,我终于可以将其作为一个潜在的解决方案提供,至少对于更简单的情况:

{
    "$expr": {
        "$not": {
            "$cmp": [{
                "$let": {
                    "vars": { "updated": { "$objectToArray": "$updateDescription.updatedFields" } },
                    "in": { "$arrayElemAt": [ "$$updated.k", 0 ] }
                }},
                "example.subdocument.nested_field"
            ]
        }
    }
}

当然替换example.subdocument.nested_field为您自己的点符号字段路径。

于 2020-10-25T01:26:55.667 回答