使用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 回复
先生,我已经按照您在私信中描述的方式发送了完整的代码,您能帮助我解决这个问题吗?
这完全取决于您的身份验证实现方式。您可以将用户已有的密码与尝试登录时使用的密码进行比较,并据此做出响应,但我不建议在存储层进行这种操作。
如果您能帮忙,我还需要另一个帮助,先生。我该如何设置密码和电子邮件验证,并使用相同的代码返回有用的回复?如果我使用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)
主要问题:
- 原代码返回
*mongo.SingleResult而不是解码后的用户对象 - 错误处理不正确,
clientInstanceError不是FindOne的返回错误 - 缺少对查询结果的解码步骤
确保你的model.User结构体有正确的bson标签:
type User struct {
Email string `bson:"email"`
Password string `bson:"password"`
// 其他字段...
}

