mongodb - 如何返回 ID 为

标签 mongodb go mgo

我有一个 MongoDB 集合,其中包含如下示例文档:

Mongo example document

我想做的(正如您从实际代码中看到的那样)是更新 members.x.role 中的一个 role 字段,其中 members. x.id 等于给定的 ID(ID 是 UUID,所以它是唯一的;这部分代码可以正常工作)然后我想返回那个 members.x。但问题是它总是返回第一个成员而不是刚刚更新的那个。我已经尝试了 mgo 的一些方法并发现 Distinct() 最接近我的期望,但它并没有像我想要的那样工作。

我的问题是如何返回具有指定 ID 的 member 嵌入文档

我已经看过 thisthis但这对我没有帮助。

func (r MongoRepository) UpdateMemberRole(id string, role int8) (*Member, error) {
    memberQuery := &bson.M{"members": &bson.M{"$elemMatch": &bson.M{"id": id}}}
    change := &bson.M{"members.$.role": role}

    err := r.db.C("groups").Update(memberQuery, &bson.M{"$set": &change})
    if err == mgo.ErrNotFound {
        return nil, fmt.Errorf("member with ID '%s' does not exist", id)
    }

    // FIXME: Retrieve this member from query below. THIS ALWAYS RETURNS FIRST MEMBER!!!
    var member []Member
    r.db.C("groups").Find(&bson.M{"members.id": id}).Distinct("members.0", &member)

    return &member[0], nil
}

最佳答案

我找到了一个解决方法,它不是返回此嵌入式文档的严格 Mongo 查询,但在我看来,这段代码比一些无论如何都获取整个文档的花哨的 Mongo 查询更清晰易懂。

func (r MongoRepository) UpdateMemberRole(id string, role int8) (*Member, error) {
    change := mgo.Change{
        Update: bson.M{"$set": bson.M{"members.$.role": role}},
        ReturnNew: true,
    }

    var updatedGroup Group
    _, err := r.db.C("groups").Find(bson.M{"members": bson.M{"$elemMatch": bson.M{"id": id}}}).Apply(change, &updatedGroup)
    if err == mgo.ErrNotFound {
        return nil, fmt.Errorf("member with ID '%s' does not exist", id)
    } else if err != nil {
        return nil, err
    }

    for _, member := range updatedGroup.Members {
        if member.Id == id {
            return &member, nil
        }
    }

    return nil, fmt.Errorf("weird error, Id cannot be found")
}

关于mongodb - 如何返回 ID 为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49630950/

相关文章:

javascript - Mongodb sort Aggregation in same order ids 在过滤器上传递

go - 循环映射时去追加很奇怪

node.js - golang tcp socket - 处理多条消息

mongodb - 如何在 golang 中编写 MongoDB $slice

json - 在 Go 中流式传输 BSON->JSON HTTP 回复?

mongodb - 计算数组中元素的数量

javascript - InMemoryDataService 导致 MongoDB 错误

javascript - 如何在 MongoDB 中更新多个对象但使用相同的数据?

node.js - Mongoose,在模式(枚举)中定义 OR 引用?

go - 用它的变量制作一个结构的 slice