我在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正确吗?
答案 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} }。