go mongo-driver动态条件

在go mongo中查询是使用的是bson.M类型的条件,但是直接使用时无法动态添加条件,只能初始化赋值,bson.M其实就是map类型,只能使用someMap[“someKey”]=“someValue” 的形式添加,这样的话只能是用if判断字段的值来决定是否添加map key/value,写起来比较繁琐。还有一种是利用结构体转换为bson.M来实现。

//构造一个查询结构体
search := User{
		ID: id,
		Name: name,
		Age: age,
	}
//构造一个条件变量
	condition := bson.M{}
	//将结构体转为字节数组,userInfo中的字段根据需要设置值,需要保证没有值时不会有默认值出现
	userbyte, err := bson.Marshal(search)
	if err != nil {
		return user, err
	}
	//将字节码转为bson.M类型
	bson.Unmarshal(userbyte, &condition)
	log.Println(condition)
	if err = this.mongo.Collection("user").FindOne(context.TODO(),
		condition).Decode(&user); err != nil {
		return user, err
	}

以上基本就实现了动态条件查询的效果,其中:

search := User{
		ID: id,
		Name: name,
		Age: age,
	}

search结构中的字段可能值为空,假设在前端并未传递age字段,那么最终condition=map[id:xxx,name:xxx],并不会出现age:0这个的字段,有效避免了零值情况。