通过mgo v2(golang,mongoDB)更新结构的数组元素

时间:2019-06-07 17:12:13

标签: mongodb go struct mgo

我有类似的结构:

type Meet struct {
    Title   string    `json:title`
    Time    time.Time `json:time`
    Host    string    `json:host`
    Crowd   []string  `json:crowd`
    Geo     Location  `json:location`
    Invoice []Bill    `json:invoice`
}

type User struct {
    ID         bson.ObjectId   `json:"id" bson:"_id,omitempty"`
    Name       string          `json:name`
    Phone      string          `json:phone`
    Email      string          `json:email`
    Vc         string          `json:vc`
    Status     int8            `json:status`
    Avatar     string          `json:avatar`
    FriendList []bson.ObjectId `json:friendlist`
    Meetings   []Meet          `json:meetings`
    Requests   []Request       `json:request`
}

,并希望更新会议的发票(例如:User.Meetings [0]。发票) 我的代码就像:

        query := bson.M{
            "_id":            bson.ObjectIdHex(personId),
            "Meetings.Title": Title,
            "Meetings.Geo":   Geo,
        }
        update := bson.M{
            "$set": bson.M{
                "Meetings.$.Invoice": updateInvoice,
            },
        }

        updateErr = collection.Update(query, update)

仅找到我所得到的错误error.commenting Meetings.Geo没有帮助并导致相同的原因。未找到。 这是我的查询有问题还是什么?

1 个答案:

答案 0 :(得分:0)

查询中的字段应该是Meetings.title和Meetings.geo。我只是使用我的一个数据库进行了测试,并且字段的大小写很重要。在您的更新中,会议应该是会议。名称取自结构项标签名而不是结构项名。例如

struct test {
    ID bson.   bson.ObjectId `bson:"_id"`
    TestString string        `bson:"ts"`
    Amount     int           `bson:"am"`
}

query := bson.M{"ts": "test", "am": 2}

因为_id字段必须存在,所以您不能对_id有所保留。