golang使用mongo-driver操作——查(基础)

不管任何数据库,查都是最复杂的操作。

基本查询,并且解析成结构体:

// 最基本的查询,一个查询条件即可,参考:https://www.mongodb.com/docs/manual/tutorial/query-documents/
func Find(mongo *mongo.Database, ctx context.Context) {
	baseAdd := create.BaseAdd{}

	filter := bson.M{} // 空结构体匹配所有
	// 查询数据,并解析成结构体
	err := mongo.Collection("test").FindOne(ctx, filter).Decode(&baseAdd)
	if err != nil {
		fmt.Println("err")
	}

	fmt.Println(baseAdd)
}

匹配多个值,且解析成结构体数组:

// 用$in关键字查询有多个值的情况
func FindIn(mongo *mongo.Database, ctx context.Context) {
	filter := bson.M{"int32": bson.M{"$in": bson.A{math.MaxInt32, math.MaxInt32 - 1}}}
	cur, err := mongo.Collection("test").Find(ctx, filter)
	if err != nil {
		fmt.Println("err")
	}
	// 多个文档解析程数组的方法
	var baseAdd []create.BaseAdd
	err = cur.All(ctx, &baseAdd)
	fmt.Println(err)
	fmt.Println(baseAdd)
}

大于和等于的匹配查询,并遍历结果:

// 用gt和lt关键字查询大于和小于,后面加个e表示等于
func FindGteAndLte(mongo *mongo.Database, ctx context.Context) {
	// 多个条件是隐式的and关系,表示要同时满足全部条件
	filter := bson.M{"int32": bson.M{"$gte": math.MaxInt32 - 1, "$lt": math.MaxInt32}}
	cur, err := mongo.Collection("test").Find(ctx, filter)
	if err != nil {
		fmt.Println("err")
	}
	// 遍历数据
	for cur.TryNext(ctx) {
		result, _ := cur.Current.Elements()
		fmt.Println(result)
	}
	cur.Close(ctx)
}

通常我们查询条件都是隐式and关系,可以使用or关键字表示多个条件只需满足其一:

	// or对应的是个数组,只要满足数组里任一条件都可
	filter := bson.M{"$or": bson.A{bson.M{"int32": bson.M{"$gte": math.MaxInt32 - 1}}, bson.M{"int32": bson.M{"$lt": math.MaxInt32}}}}

嵌套字段的查询匹配:

filter := bson.M{"object.id": 2} // 直接用点连接就好,没什么区别

之前的查询我们都是返回所有字段,还可以选择查询指定字段:

	// 1表示只查询id字段,但是,主键_id会默认查询出来
	options := options.FindOptions{Projection: bson.M{"id": 1}}
	// 所以还可以加上"_id": 0排除主键
	options := options.FindOptions{Projection: bson.M{"id": 1, "_id": 0}} 

与上面相反,可以指定一个字段不要,查询剩余字段:

	// 排除_id,其他字段都会被查出来,可以排除多个
	options := options.FindOptions{Projection: bson.M{"_id": 0}}

对于嵌套的文档也同样受用,且用LookupErr遍历时,仅获取想要的key值:

// 对于嵌套的文档也同样受用
func FindChildField(mongo *mongo.Database, ctx context.Context) {
	filter := bson.M{} // 空结构体匹配所有
	// 嵌套字段也一样这么查
	options := options.FindOptions{Projection: bson.M{"object.id": 1, "_id": 0}}

	cur, err := mongo.Collection("test").Find(ctx, filter, &options)
	if err != nil {
		fmt.Println("err")
	}
	// 遍历数据
	for cur.TryNext(ctx) {
		result, _ := cur.Current.LookupErr("object")
		fmt.Println(result)
	}
	cur.Close(ctx)
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lsjweiyi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值