0

我在我的应用程序中存储用户并将他们视为宇宙的中心,我现在尝试引入 Org 的概念,用户可以是许多 Orgs 的成员,然后某些设置等将属于 Org。我正在尝试创建的功能是搜索可以找到用户 ID 的所有组织以及所有者或成员之一,并返回一个组织列表,然后在客户端呈现详细信息。

我遇到的问题与 Mongo Find 结果的处理和转换有关,然后是如何处理并转换为我可以在最后安全返回的格式。

目前我无法返回错误的数据

不能在 return 语句中使用 &org (*[]*model.Org 类型的值) 作为 *model.Org 值

组织模式

封装模型

// Org is the structure of a org
type Org struct {
    ID          string   `json:"id" bson:"_id"`
    Name        string   `json:"name" bson:"name"`
    Owner       string   `json:"owner" bson:"owner"`
    Members     []string `json:"members" bson:"members"`
    Token       string   `json:"token" bson:"-"`
    VerifyToken string   `json:"verifyToken" bson:"verifyToken"`
}

功能

// GetOrgByUserID returns a user by his id
func (db *DB) GetOrgByUserID(id string) (*model.Org, error) {
    findOptions := options.Find()

    var org []*model.Org

    cur, err := db.collections.orgs.Find(context.TODO(), bson.D{{"owner", id}}, findOptions)
    if err != nil {
        return nil, err
    }
    // Iterate through the cursor
    for cur.Next(context.TODO()) {
        var elem model.Org
        err := cur.Decode(&elem)
        if err != nil {
            return nil, err
        }

        org = append(org, &elem)
    }

    if err := cur.Err(); err != nil {
        return nil, err
    }
    // Close the cursor once finished
    cur.Close(context.TODO())

    return &org, nil
}
4

1 回答 1

1

通过将返回值声明为切片来修复。此外,使用cursor All方法简化代码:

func (db *DB) GetOrgByUserID(id string) ([]*model.Org, error) {
    findOptions := options.Find()
    cur, err := db.collections.orgs.Find(context.TODO(), bson.D{{"owner", id}}, findOptions)
    if err != nil {
        return nil, err
    }
    defer cur.Close(ctx.TODO())
    var org []*model.Org
    err = cur.All(ctx.TODO(), &org)
    return org, nil
}
于 2020-02-23T23:31:34.893 回答