首页 > 解决方案 > 如何更新 DocumentDB 中双嵌套数组中的嵌入文档

问题描述

我想更新双嵌套数组中的嵌入文档。

所以目标是更新

"switchState": "live"

在以下条件匹配上

cuid: req.params.cuid
Input.Id: req.params.id

我已经尝试过以下代码 mongoDb 并且有效


await Workflow
       .findOneAndUpdate({
                    // createdBy: req.user._id,
                    cuid: req.params.cuid,
                    'inputFillers': {
                        $elemMatch: {
                            $elemMatch: {
                                "Input.Id": req.params.fillerInputId
                            }
                        }
                    }
                },
                    {
                        $set: {
                            'inputFillers.$.0.switchState': req.params.switchType
                        }
                    },
                    { new: true }
                )
                .lean()
                .exec()

它会更新我为每个输入 ID 所做的每个选择。

但是相同的代码不适用于 DocumentDb(MongoDb 兼容版本 4.2)

这是 AWS 网站上关于 $elemmatch for documentDB 的一些建议

https://docs.aws.amazon.com/documentdb/latest/developerguide/functional-differences.html#functional-differences.elemMatch

我已经尝试关注 documentDB

await Workflow
                .findOneAndUpdate({
                    // createdBy: req.user._id,
                    cuid: req.params.cuid,
                    //  'inputFillers.0.0.Input.Id': req.params.fillerInputId,
                    $and: [{
                        'inputFillers': {
                            $elemMatch: {
                                $elemMatch: {
                                    "Input.Id": req.params.fillerInputId
                                }
                            }
                        }
                    }]
                },
                    {
                        $set: {
                            'inputFillers.$.0.switchState': req.params.switchType
                        }
                    },
                    { new: true }
                )
                .lean()
                .exec()

但它不起作用,只有时间它起作用,如果我使用

{
   $set: {
       'inputFillers.0.0.switchState': req.params.switchType
         }
  }

代替

{
   $set: {
       'inputFillers.$.0.switchState': req.params.switchType
         }
  }

但这总是只更新第一个元素,这违背了目的。

我一直在探索,并且读到有人建议为 mongoDb 使用 $map、$filter,但是使用双嵌套数组还没有取得太大的成功。

这是我编写的地图过滤器函数,不知道在这种情况下如何将其转换为 mongo

function switchInputFiller(input, switchTo) {
    let newInputFiller = inputFillers
        .map(firstEach => firstEach[0])
        .filter(each => {

            if (each.Input.Id == input) {
                return each.switchState = switchTo
            }
        })
    // console.log()
    return newInputFiller
}
console.log("New Input Filler is ", switchInputFiller('8857157', "filler"))

这是样本数据

{
        cuid: "cktzaqcr700001fpmypaa90zm",
        inputFillers: [
            [
                {
                    "Input": {
                        "Arn": "some arn",
                        "AttachedChannels": [],
                        "Destinations": [],
                        "Id": "6465886",
                        "InputClass": "STANDARD",
                        "InputDevices": [],
                        "InputSourceType": "STATIC",
                        "MediaConnectFlows": [],
                        "Name": "tes01-84798-filer-input-0",
                        "SecurityGroups": [],
                        "Sources": [
                            {
                                "Url": "some url"
                            },
                            {
                                "Url": "some url"
                            }
                        ],
                        "State": "DETACHED",
                        "Tags": {
                            "resourceScope": "API-DRIVEN-MEDIALIVE-INPUT-FILLER",
                            "mediaProject": "SOCIAL-STREAMING",
                            "socialEvent": "tes01-84798"
                        },
                        "Type": "MP4_FILE"
                    },
                    "runtime": "now",
                    "fillerName": "somefiller",
                    "switchState": "live"
                }
            ],
            [
                {
                    "Input": {
                        "Arn": "some arn",
                        "AttachedChannels": [],
                        "Destinations": [],
                        "Id": "8857157",
                        "InputClass": "STANDARD",
                        "InputDevices": [],
                        "InputSourceType": "STATIC",
                        "MediaConnectFlows": [],
                        "Name": "tes01-84798-filer-input-1",
                        "SecurityGroups": [],
                        "Sources": [
                            {
                                "Url": "some url"
                            },
                            {
                                "Url": "some url"
                            }
                        ],
                        "State": "DETACHED",
                        "Tags": {
                            "resourceScope": "API-DRIVEN-MEDIALIVE-INPUT-FILLER",
                            "mediaProject": "SOCIAL-STREAMING",
                            "socialEvent": "tes01-84798"
                        },
                        "Type": "MP4_FILE"
                    },
                    "runtime": "now",
                    "fillerName": "730ivi",
                    "switchState": "live"
                }
            ]
        ]
    },
    {
        cuid: "cktzaqcr700001fpmypaa90AB",
        inputFillers: [
            [
                {
                    "Input": {
                        "Arn": "some arn",
                        "AttachedChannels": [],
                        "Destinations": [],
                        "Id": "6465886",
                        "InputClass": "STANDARD",
                        "InputDevices": [],
                        "InputSourceType": "STATIC",
                        "MediaConnectFlows": [],
                        "Name": "tes01-84798-filer-input-0",
                        "SecurityGroups": [],
                        "Sources": [
                            {
                                "Url": "some url"
                            },
                            {
                                "Url": "some url"
                            }
                        ],
                        "State": "DETACHED",
                        "Tags": {
                            "resourceScope": "API-DRIVEN-MEDIALIVE-INPUT-FILLER",
                            "mediaProject": "SOCIAL-STREAMING",
                            "socialEvent": "tes01-84798"
                        },
                        "Type": "MP4_FILE"
                    },
                    "runtime": "now",
                    "fillerName": "somefiller",
                    "switchState": "live"
                }
            ],
            [
                {
                    "Input": {
                        "Arn": "some arn",
                        "AttachedChannels": [],
                        "Destinations": [],
                        "Id": "8857157",
                        "InputClass": "STANDARD",
                        "InputDevices": [],
                        "InputSourceType": "STATIC",
                        "MediaConnectFlows": [],
                        "Name": "tes01-84798-filer-input-1",
                        "SecurityGroups": [],
                        "Sources": [
                            {
                                "Url": "some url"
                            },
                            {
                                "Url": "some url"
                            }
                        ],
                        "State": "DETACHED",
                        "Tags": {
                            "resourceScope": "API-DRIVEN-MEDIALIVE-INPUT-FILLER",
                            "mediaProject": "SOCIAL-STREAMING",
                            "socialEvent": "tes01-84798"
                        },
                        "Type": "MP4_FILE"
                    },
                    "runtime": "now",
                    "fillerName": "netflix",
                    "switchState": "live"
                }
            ]
        ]
    }

标签: javascriptarraysmongodbamazon-web-servicesaws-documentdb

解决方案


推荐阅读