如何将对象推入mongodb数组

时间:2020-02-05 08:46:51

标签: mongodb go

我在mongodb集合中有下面的JSON

{
  "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)

但是当我推动时,它不能很好地附加,我得到了

{
  "_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

{
  "_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,如下所示。我也想使用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正确吗?

1 个答案:

答案 0 :(得分:0)

您正在尝试将元素追加到嵌套数组中,因此需要指定完整的“路径”。在您的情况下,您可以只为allowedNssaiList使用index = 0,因为您只有一个文档:

bson.M {“ $ addToSet”:bson.M {“ allowedNssaiList.0.allowedSnssaiList” ...

我认为您正在使用mgo,但它应该等效于mongo-go-driver:

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 positional operator $[](请注意positional $ operator does not seem to like traversing more than one array)或{{3} }。