golang mongo-driver filter 构建--bson和golang基础类型

go.mongodb.org/mongo-driver 是mongo的golang官方包

通过例子我知道连接是这样的
clientOptions := options.Client().ApplyURI("mongodb://tag:[email protected]:27017/tag")

	client, err := mongo.NewClient(clientOptions)
	if err != nil {
		fmt.Println(err)
	}

	ctx, _ := context.WithTimeout(context.Background(), 2*time.Second)
	err = client.Connect(ctx)

	err = client.Ping(ctx, readpref.Primary())

	//tag := UserTag{
	//	Rid:    1,
	//	Aid:    "aid",
	//	Uqid:   "",
	//	Values: map[string]string{"1": "a", "2": "b"},
	//}
	collection := client.Database("tag").Collection("usertag")
	ctx, _ = context.WithTimeout(context.Background(), 5*time.Second)

	t := UserTag{}
	//db,usertag.find({$or :[{‘rid‘: 1},{‘aid‘: ‘‘},{‘uqid‘: ‘‘}]});
	//err = collection.FindOne(ctx,bson.M{"$or": bson.A{bson.M{"rid":1},bson.M{"aid":"a"}}}).Decode(&t)
	err = collection.FindOne(ctx,map[string]interface{}{"$or":[]interface{}{map[string]interface{}{"rid":1}}}).Decode(&t)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(t)

  所有的find方法都有一个filer参数, 等同于命令行里的

db.usertag.find({$or :[{‘rid‘: 1},{‘aid‘: ‘‘},{‘uqid‘: ‘‘}]});

  但是在代码的实现例filter并不能写成这样

filter := `{$or :[{‘rid‘: 1},{‘aid‘: ‘‘},{‘uqid‘: ‘‘}]}`

  这样是不识别的, 我们需要用到bson里提供的几种结构体

type D = primitive.D

// E represents a BSON element for a D. It is usually used inside a D.
type E = primitive.E

// M is an unordered representation of a BSON document. This type should be used when the order of the elements does not
// matter. This type is handled as a regular map[string]interface{} when encoding and decoding. Elements will be
// serialized in an undefined, random order. If the order of the elements matters, a D should be used instead.
//
// Example usage:
//
// 		bson.M{"foo": "bar", "hello": "world", "pi": 3.14159}
type M = primitive.M

// An A is an ordered representation of a BSON array.
//
// Example usage:
//
// 		bson.A{"bar", "world", 3.14159, bson.D{{"qux", 12345}}}
type A = primitive.A

  

其中M是map A是列表

所以我们的filter就构造成这样的

filter := bson.M{"$or": bson.A{bson.M{"rid":1},bson.M{"aid":"a"}}}

 我们再去看M,A底层数据结构是什

// M is an unordered representation of a BSON document. This type should be used when the order of the elements does not
// matter. This type is handled as a regular map[string]interface{} when encoding and decoding. Elements will be
// serialized in an undefined, random order. If the order of the elements matters, a D should be used instead.
//
// Example usage:
//
// 		bson.M{"foo": "bar", "hello": "world", "pi": 3.14159}.
type M map[string]interface{}

// An A is an ordered representation of a BSON array.
//
// Example usage:
//
// 		bson.A{"bar", "world", 3.14159, bson.D{{"qux", 12345}}}
type A []interface{}

  

所以我们的filter也可以写成这样

filter := map[string]interface{}{"$or":[]interface{}{map[string]interface{}{"rid":1}}}

  

所以我们就可以对照mongo命令文档转成golang代码里的filter了

原因在与mongo底层的通信都是bson(二进制json), 没办法识别字符串, mongo命令行识别是因为client基于json字符串为基础, 去转换成bson格式了

原文地址:https://www.cnblogs.com/leescre/p/12625240.html

时间: 2024-10-31 09:55:55

golang mongo-driver filter 构建--bson和golang基础类型的相关文章

Golang友团无闻Go语言Web基础视频教程

教程内容:GO语言资料Golang友团无闻Go语言编程基础Golang友团无闻Go语言Web基础教程 Go语言Web基础教程列表:[Go Web基础]12Go Web 扩展学习.mp4[Go Web基础]11简易的 RPC 实现.mp4[Go Web基础]10自建 HTTP 中间件.mp4[Go Web基础]09国际化支持.mp4[Go Web基础]08文章附件上传.mp4[Go Web基础]07为文章添加标签.mp4[Go Web基础]06评论与分类显示.mp4[Go Web基础]05文章的添

.net Mongo Driver 1.0与2.0的对比与2.0的优化

前言 最近闲的时间有点多,所以还是写博客吧. 有人说Mongo 2.0的写法难以把控,好多地方不知道咋用,所以坚持用1.0(不愿意去尝试2.0),我感觉不可理解.所以写篇博客比较下. Mongo C#驱动1.0到2.0设计方面的差别非常大. 正文 先说1.0吧,更像是Mongo 各功能的直译,所以写法与mongo原生查询修改等比较类似,易上手.但是设计上确实存在很多问题.简单说几点: a.在query的构建方面,虽然有问题,但是勉强能接受 1 var modelCursor = collecti

Golang精编100题-搞定golang面试

Golang精编100题 能力模型 级别 模型 初级 primary 熟悉基本语法,能够看懂代码的意图:在他人指导下能够完成用户故事的开发,编写的代码符合CleanCode规范: 中级 intermediate 能够独立完成用户故事的开发和测试:能够嗅出代码的坏味道,并知道如何重构达成目标: 高级 senior 能够开发出高质量高性能的代码:能够熟练使用高级特性,开发编程框架或测试框架: 选择题 1.   [初级]下面属于关键字的是()A. funcB. defC. structD. class

你的首个golang语言详细入门教程 | your first golang tutorial

本文首发于个人博客https://kezunlin.me/post/a0fb7f06/,欢迎阅读最新内容! your first golang tutorial go tutorial versions: go: 1.13.1 install wget https://dl.google.com/go/go1.13.1.linux-amd64.tar.gz sudo tar -C /usr/local -xzf go1.13.1.linux-amd64.tar.gz ll /usr/local/

在php添加mongo过程中出现的mongo.so: > undefined symbol: php_json_encode in Unknown on line 0. After installation mongo driver for php 的错误

3 down vote my system is centos 6.3. I got the problem solved. vim /etc/php.ini then add extension=json.so before extension=mongo.so at last restart the php-fpm and nginx(apache) service php-fpm restart service ngxin restart It's OK!

Golang学习笔记(2)---go语言基本类型

布尔型:bool 长度1字节 取值范围:true,false 注意:不可以用数字代表true或false 整型:Int 根据平台可能为32为或64位 8位整型:int8/uint8 长度:1字节 取值范围:-127~127,0~255 byte 字节型  其实就是 uint8的别名 16位整型:int16/uint16 长度:2字节 取值范围:-32768~32768,0~65535 32位整型:int32/uint32 长度:4字节 rune就是int32的别名 浮点型:float32/flo

golang基础类型

1.变量 Go使用关键字var定义变量,类型信息放在变量名后面,初始化为零,如下: 在函数内部还有一种更简洁的:=定义方式 变量赋值,两个变量可直接交换 注意:函数内部定义的变量没使用的话编译器会报错. declared and not used 2 常量 用关键词const定义,常量值必须是编译期间能够确定的数值. 枚举iota,从0开始按行数自增,如果重新const,则从0开始再次计算. 3 类型 Go内置以下基础类型: 布尔类型:bool. 整型:int8.byte.int16.int.u

docker-compose 构建mongodb并导入基础数据示例

使用docker-compose构建mongodb服务并导入基础数据示例. 1.文件目录结构 --mongo/ |--docker-compose.yml |--mongo-Dockerfile |--setup.sh |--data/ |--xxx1.json |--xxx2.json 2.docker-compose.yml 1 services: 2 mongo_db: 3 build: 4 context: . 5 dockerfile: mongo-Dockerfile 6 resta

基于WinSrv2016(TP)构建的“超融合基础架构”

最近发现一个很热门的话题,国内的很多厂商也搞出了自己的"超融合基础架构服务器",那么什么是"超融合基础架构"呢? 超融合基础架构(Hyper-Converged Infrastructure,或简称"HCI")也被称为超融合架构,是指在同一套单元设备(x86服务器)中不仅仅具备计算.网络.存储和服务器虚拟化等资源和技术,而且还包括缓存加速.重复数据删除.在线数据压缩.备份软件.快照技术等元素,而多节点可以通过网络聚合起来,实现模块化的无缝横向扩展