Обновление вложенного объекта с использованием позиционных фильтров на разных уровнях - обновление MongoDb - PullRequest
1 голос
/ 13 апреля 2020

Учитывая, что у меня есть следующая коллекция (игнорируя документы _id):

Коллекция

[
  {
    "Id": "1",
    "Level2": [
      {
        "Id": "1.1",
        "Level3": [
          {
            "Id": "1.1.1",
            "Level3_4": {
              "Transport": "Car",
              "Level4": [
                {
                  "Id": "1.1.1.1",
                  "Status": "run",
                  "Direction": "N"
                },
                {
                  "Id": "1.1.1.2",
                  "Status": "run",
                  "Direction": "S"
                },
                {
                  "Id": "1.1.1.3",
                  "Status": "pause",
                  "Direction": "S"
                },
                {
                  "Id": "1.1.1.4",
                  "Status": "run",
                  "Direction": "W"
                }
              ]
            }
          },
          {
            "Id": "1.1.2",
            "Level3_4": {
              "Transport": "Bus",
              "Level4": [
                {
                  "Id": "1.1.2.1",
                  "Status": "run",
                  "Direction": "S"
                },
                {
                  "Id": "1.1.2.2",
                  "Status": "stop",
                  "Direction": "N"
                },
                {
                  "Id": "1.1.2.3",
                  "Status": "stop",
                  "Direction": "W"
                },
                {
                  "Id": "1.1.2.4",
                  "Status": "run",
                  "Direction": "E"
                }
              ]
            }
          }
        ]
      },
      {
        "Id": "1.2",
        "Level3": [
          {
            "Id": "1.2.1",
            "Level3_4": {
              "Transport": "Train",
              "Level4": [
                {
                  "Id": "1.2.1.1",
                  "Status": "run",
                  "Direction": "N"
                }
              ]
            }
          },
          {
            "Id": "1.2.2",
            "Level3_4": {
              "Transport": "Bus",
              "Level4": []
            }
          }
        ]
      }
    ]
  }
]

Обновление

Я хочу обновить все документы в коллекции, такие как:

  • Level2.Level3.Level3_4.Level4.Status: "pause"

Использование updateOne и без upsert

Все Level4, которые соответствуют следующим условиям


Условия

где:

  • Level2.Level3.Id $in ["1.1.1","1.1.2"] И
  • Level2.Level3.Level3_4.Level4.Status $in ["run", "stop"] И
  • Level2.Level3.Level3_4.Level4.Direction $in ["N", "S"]

РЕЗУЛЬТАТ

Результат должен быть таким:

[
  {
    "Id": "1",
    "Level2": [
      {
        "Id": "1.1",
        "Level3": [
          {
            "Id": "1.1.1",
            "Level3_4": {
              "Transport": "Car",
              "Level4": [
                {
                  "Id": "1.1.1.1",
                  "Status": "pause",
                  "Direction": "N"
                },
                {
                  "Id": "1.1.1.2",
                  "Status": "pause",
                  "Direction": "S"
                },
                {
                  "Id": "1.1.1.3",
                  "Status": "pause",
                  "Direction": "S"
                },
                {
                  "Id": "1.1.1.4",
                  "Status": "run",
                  "Direction": "W"
                }
              ]
            }
          },
          {
            "Id": "1.1.2",
            "Level3_4": {
              "Transport": "Bus",
              "Level4": [
                {
                  "Id": "1.1.2.1",
                  "Status": "pause",
                  "Direction": "S"
                },
                {
                  "Id": "1.1.2.2",
                  "Status": "pause",
                  "Direction": "N"
                },
                {
                  "Id": "1.1.2.3",
                  "Status": "stop",
                  "Direction": "W"
                },
                {
                  "Id": "1.1.2.4",
                  "Status": "run",
                  "Direction": "E"
                }
              ]
            }
          }
        ]
      } ... 
    ]
  }
]

Я борюсь с оператором $set и arrayFilters. Как я могу выполнить sh это?


Вот куда я зашел:

db.test.update({},
    {
        $set: {
            "Level2.$[level2].Level3.$[level3].Level3_4.Level4.$[level4].Status": "pause"
        }
    },
    {
        arrayFilters: [
            {
                "level3.Id": {
                    $in: [
                        "1.1.1",
                        "1.1.2"
                    ]
                }
            },
            {
                "level4.Status": {
                    $in: [
                        "run",
                        "stop"
                    ]
                }
            },
            {
                "level4.Direction": {
                    $in: [
                        "N",
                        "S"
                    ]
                }
            }
        ]
    }
)          

Однако это не работает ... Что я делаю не так?

1 Ответ

1 голос
/ 13 апреля 2020

Вы были почти там :)

Просто проблема была с последним фильтром массива и в $set

Я обновил запрос:

db.session.update(
    {},
    {
        $set: {
            "Level2.$[].Level3.$[level3].Level3_4.Level4.$[level4].Status": "pause"
        }
    },
    {
        arrayFilters: [
            {
                "level3.Id": {
                    $in: [
                        "1.1.1",
                        "1.1.2"
                    ]
                }
            },
            {
                "level4.Status": {
                    $in: [
                        "run",
                        "stop"
                    ]
                },
                "level4.Direction": {
                    $in: [
                        "N",
                        "S"
                    ]
                }
            }
        ]
    }
)   

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...