Как поместить sh объект в массив mongodb - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть JSON ниже в коллекции mongodb

{
  "Id":"3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "allowedNssaiList": [
    {
      "allowedSnssaiList": [
        {
          "allowedSnssai": {
            "sst": 1,
            "sd": "2"
          },
          "IMSI": "244340000000001",
          "tac": "3022"
        }
      ],
      "accessType": "3GPP_ACCESS"
    }
  ]
}

Я хотел бы добавить к подмассиву allowSnssaiList объект

        {
          "allowedSnssai": {
            "sst": 1,
            "sd": "2"
          },
          "IMSI": "244340000000001",
          "tac": "3022"
        }

Я пробовал со следующим

selector := bson.M{"_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"}
PushToArray := bson.M{"$addToSet": bson.M{"allowedSnssaiList": bson.M{"allowedSnssai": bson.M{"sst": 3,"sd": "4"}, "IMSI": "244510000000004","tac": "3022"}}}

err := db.C(COLLECTION).Update(selector, PushToArray)

но когда я пу sh, он плохо добавляется, я получаю

{
  "_id":"3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "allowedNssaiList": [
    {
      "allowedSnssaiList": [
        {
          "allowedSnssai": {
            "sst": 1,
            "sd": "2"
          },
          "IMSI": "244340000000001",
          "tac": "3022"
        }
      ],
      "accessType": "3GPP_ACCESS"
    }
  ],
  "allowedSnssaiList" : [
        {
            "allowedSnssai" : {
                "sst" : 1,
                "sd" : "5"
            },
            "IMSI" : "244340000000005",
            "tac" : "3022"
        }
    ]
}

, но я хочу получить результат или добавить как

{
  "_id":"3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "allowedNssaiList": [
    {
      "allowedSnssaiList": [
        {
          "allowedSnssai": {
            "sst": 1,
            "sd": "2"
          },
          "IMSI": "244340000000001",
          "tac": "3022"
        },
        {
                "allowedSnssai" : {
                    "sst" : 1,
                    "sd" : "5"
                },
                "IMSI" : "244340000000005",
                "tac" : "3022"
            }
      ],
      "accessType": "3GPP_ACCESS"
    }
  ]
}

Даже изменение на

PushToArray := bson.M{"$addToSet": bson.M{"allowedNssaiList[0].allowedSnssaiList[0]": bson.M{"allowedSnssai": bson.M{"sst": 3,"sd": "4"}, "IMSI": "244510000000004","tac": "3022"}}}

по-прежнему не работает. Любая помощь о том, как достичь моего результата.

Спасибо за ответ ниже, я смог добавить нужный массив, как хотел, однако, я хотел бы изменить любой из объектов, добавленных в массив, поэтому я добавил дополнительное поле ssid в качестве идентификатора для каждого объекта как

{
  "_id":"3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "allowedNssaiList": [
    {
      "allowedSnssaiList": [
        {
          "allowedSnssai": {
            "sst": 1,
            "sd": "2"
          },
          "IMSI": "244340000000001",
          "tac": "3022",
           "ssid":1
        },
        {
                "allowedSnssai" : {
                    "sst" : 1,
                    "sd" : "5"
                },
                "IMSI" : "244340000000005",
                "tac" : "3022",
                "ssid":2
            }
      ],
      "accessType": "3GPP_ACCESS"
    }
  ]
}

Чтобы изменить или обновить значения для объекта с ssid = 2, у меня есть

selector := bson.M{"_id": "3ca85f64-5717-4562-b3fc-2c963f66af33",
        "allowedNssaiList.allowedSnssaiList.ssid": 2}

UpdateArray := bson.M{"$set": bson.M{"allowedNssaiList.0.allowedSnssaiList.$": bson.M{"allowedSnssai": bson.M{"sst": 1,
        "sd": "1000"}, "IMSI": "244340000000010","tac": "302332", "ssid": "2"}}}

err := db.C(COLLECTION).Update(selector, UpdateArray)

, это приводит к обновлению объекта с ssid = 1, но также изменяет другой объект на ssid = 1, как показано ниже. Я также хотел бы удалить указанный c объект, также используя значение ssid. Любая помощь.

{
                    "ssid" : 1,
                    "allowedSnssai" : {
                        "sst" : 1,
                        "sd" : "1000"
                    },
                    "IMSI" : "244340000000010",
                    "tac" : "302332"
                },
                {
                    "allowedSnssai" : {
                        "sst" : 1,
                        "sd" : "2"
                    },
                    "IMSI" : "244340000000001",
                    "tac" : "3022",
                    "zone" : "zone3",
                    "ssid" : 1
                }

Любая помощь, как этого добиться. Используется ли $ set right?

1 Ответ

0 голосов
/ 05 февраля 2020

Вы пытаетесь добавить элемент во вложенный массив, поэтому вам нужно указать полный «путь». В вашем случае вы можете просто использовать index = 0 для allowedNssaiList, поскольку у вас есть только один документ:

bson.M {"$ addToSet": bson.M {"allowNssaiList.0.allowedSnssaiList" ...

Я думаю, что вы используете m go, но он должен быть эквивалентен драйверу mon go - go:

colLoc := mongoClient.Database("stack").Collection("lists")

selector := bson.M{"_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"}
PushToArray := bson.M{"$addToSet": bson.M{"allowedNssaiList.0.allowedSnssaiList": bson.M{"allowedSnssai": bson.M{"sst": 3, "sd": "4"}, "IMSI": "244510000000004", "tac": "3022"}}}

res, err := colLoc.UpdateOne(
    context.Background(),
    selector,
    PushToArray,
)

Если у вас есть более одного документа в верхнем массиве, вам потребуется использовать позиционный оператор, например, all позиционный оператор $ [] (обратите внимание, что позиционный оператор $ не выглядит нравиться обходить более одного массива ) или отфильтрованный позиционный оператор $ [идентификатор] .

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