首页 > 解决方案 > MongoDB交互好实践

问题描述

我的任务是重构以下代码,这对我来说似乎是错误的。它使用 go 例程与 Mongodb 交互。

type StoreResult struct {
    Data interface{}
    Err  *model.AppError
}

type StoreChannel chan StoreResult

// **** EVERY BEHAVIOR OF NoSqlNewsStore USES "Do" TO INTERACT WITH MONGODB 
func (no NoSqlNewsStore) GetAllReactions(postID string) StoreChannel {
    return Do(func(result *StoreResult) {
        ctx, cancel := no.GetCtx()
        defer cancel()

        dbReactions, err := no.GetConn().Collection("reactions").Find(ctx, bson.M{"post_id": postID})
        if err != nil {
            fmt.Println("[error]: func GetAllReactions.Find, NoSqlStore err => " + err.Error())
            result.Err = model.NewAppError("NoSqlStore", "nosqlstore.news.get_reactions", nil, err.Error(), http.StatusInternalServerError)
            return
        }

        reactionsArr := make([]*model.Reaction, 0)

        for dbReactions.Next(ctx) {
            var reaction *model.Reaction
            if err := dbReactions.Decode(&reaction); err == nil {
                reactionsArr = append(reactionsArr, reaction)
            }
        }

        result.Data = reactionsArr
    })
}

func Do(f func(result *StoreResult)) StoreChannel {
    storeChannel := make(StoreChannel, 1)
    go func() {
        result := StoreResult{}
        f(&result)
        storeChannel <- result
        close(storeChannel)
    }()
    return storeChannel
}

我想就为什么这可能出错或不会出错提出意见。如果可能的话,一种在并发环境中通过良好实践正确解决它的方法

标签: mongodbgoconcurrencychannel

解决方案


推荐阅读