【问题标题】:How to push object into mongodb array如何将对象推送到 mongodb 数组中
【发布时间】: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。

标签: mongodb go


【解决方案1】:

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

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)或filtered positional operator $[identifier]

【讨论】:

  • 这行得通,我可以追加,但是,我想同时修改数组中的任何追加对象,因此我使用 $set 尝试修改 is 但它不是按照我上面的解释工作
  • 很高兴它起作用了 :) 我相信新请求独立于原始问题。您介意用新请求打开一个新问题吗? (当然,只有在没有被问到的情况下)。这样别人会更容易回答,而且对以后有同样疑问的人也会更有用。
  • 我尝试打开一个新请求,但无法打开,因为响应是“抱歉您已达到问题限制...”
  • 好的...尝试在更新前后对文档提出新问题。同时,请确保 _id 是正确的(示例和代码显示了两个不同的 _id 值)。不确定这是否是正确的陈述,但我试过了,它只用 ssid:1 (更新为 2)从允许的SnssaiList 更新了文档。确保您正在查看正确的文档,因为还有一个新字段 zone 在任何地方都看不到。查看at this question关于您当前的查询
猜你喜欢
  • 2016-03-05
  • 1970-01-01
  • 2023-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 2019-03-28
相关资源
最近更新 更多