使用Golang和MongoDB如何获取单个邮件?

使用Golang和MongoDB如何获取单个邮件? 我这样做对吗? 我需要查询单个电子邮件用于用户登录,因此我开发了这个方法。 但这个方法没有返回任何错误,却无法列出电子邮件及其相关详细信息。 您能帮我找出问题所在吗?

func Find_User(user *model.User) (*mongo.SingleResult, error) {
	//Create a handle to the respective collection in the database.
	//finding user data using email and password
	query := bson.M{"email": user.Email}
	collection := clientInstance.Database(AUTH_DB).Collection(USER_COLLECTION)
	return collection.FindOne(context.TODO(), query), clientInstanceError

}

更多关于使用Golang和MongoDB如何获取单个邮件?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

非常感谢,先生。

更多关于使用Golang和MongoDB如何获取单个邮件?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


先生,我已经按照您在私信中描述的方式发送了完整的代码,您能帮助我解决这个问题吗?

这完全取决于您的身份验证实现方式。您可以将用户已有的密码与尝试登录时使用的密码进行比较,并据此做出响应,但我不建议在存储层进行这种操作。

如果您能帮忙,我还需要另一个帮助,先生。我该如何设置密码和电子邮件验证,并使用相同的代码返回有用的回复?如果我使用JSON响应,它会显示一些错误。如果您能帮助我,因为我无法直接在那里声明它们。

你忘记将结果解码到结构体了。另外,我建议以更过程化的方式编写代码,这样更容易看清操作的步骤:

func FindUser(user *model.User) (model.User, error) { 
    filter := bson.M{"email": user.Email}
	result := model.User{}
	err := clientInstance.Database(AUTH_DB).Collection(USER_COLLECTION).FindOne(context.Background(), filter).Decode(&result)
	if err != nil {
		if errors.Is(err, mongo.ErrNoDocuments) {
			return model.User{}, nil
		}

		return model.User{}, fmt.Errorf("finding user: %w", err)
	}

	return result, nil
}

你的代码在查询单个文档时使用了FindOne,但返回类型和错误处理有问题。FindOne返回的是*mongo.SingleResult,它本身不直接返回错误,错误需要在解码时检查。以下是修正后的代码示例:

func Find_User(user *model.User) (*model.User, error) {
    // 查询条件
    query := bson.M{"email": user.Email}
    collection := clientInstance.Database(AUTH_DB).Collection(USER_COLLECTION)
    
    // 执行查询
    result := collection.FindOne(context.TODO(), query)
    
    // 检查查询错误
    if err := result.Err(); err != nil {
        return nil, err
    }
    
    // 解码结果到User结构体
    foundUser := &model.User{}
    if err := result.Decode(foundUser); err != nil {
        return nil, err
    }
    
    return foundUser, nil
}

使用示例:

user := &model.User{Email: "test@example.com"}
foundUser, err := Find_User(user)
if err != nil {
    log.Printf("查询失败: %v", err)
    return
}
fmt.Printf("找到用户: %+v", foundUser)

主要问题:

  1. 原代码返回*mongo.SingleResult而不是解码后的用户对象
  2. 错误处理不正确,clientInstanceError不是FindOne的返回错误
  3. 缺少对查询结果的解码步骤

确保你的model.User结构体有正确的bson标签:

type User struct {
    Email    string `bson:"email"`
    Password string `bson:"password"`
    // 其他字段...
}
回到顶部