【发布时间】:2020-05-21 03:26:43
【问题描述】:
我在 mongodb 集合中有下面的 JSON
{
"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": "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 对吗?
【问题讨论】:
-
我不熟悉 go 但我会尝试
bson.M{"$addToSet": bson.M{"allowedNssaiList.allowedSnssaiList.": ... -
这也不起作用。
-
请注意,您作为示例提供的要附加的对象(在
"I would like to append to the sub array allowedSnssaiList with the object"部分之后)与allowedSnssaiList中已经存在的文档相同。这是相关的,因为$addToSet只会在文档不存在于数组中时插入。在 go 代码示例中,您尝试添加一个新的,这是我猜想的:) 如果您想附加元素,即使它们已经存在,您需要使用$push运算符。 -
如果文档不存在,我想追加,因此首选 $addToSet。