golang mongodb查找find demo
使用gopkg.in/mgo.v2库操作,插入操作主要使用mongodb中Collection对象的Find方法,函数原型:
func (c *Collection) Find(query interface{}) *Query
查找的时候Find的参数都会用bson.M类型
type M map[string]interface{}
例如:bson.M{"name": "Tom"}相当直接mongodb的查询条件{"name": "Tom"}
统一封装下getDB方法
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package mainimport ( "fmt" "gopkg.in/mgo.v2" "gopkg.in/mgo.v2/bson")// get mongodb dbfunc getDB() *mgo.Database { session, err := mgo.Dial("172.16.27.134:10001") if err != nil { panic(err) } session.SetMode(mgo.Monotonic, true) db := session.DB("test") return db} |
查找单条记录
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
func findOne() { db := getDB() c := db.C("user") // 用struct接收,一般情况下都会这样处理 type User struct { Name string "bson:`name`" Age int "bson:`age`" } user := User{} err := c.Find(bson.M{"name": "Tom"}).One(&user) if err != nil { panic(err) } fmt.Println(user) // output: {Tom 20} // 用bson.M结构接收,当你不了解返回的数据结构格式时,可以用这个先查看,然后再定义struct格式 // 在处理mongodb组合查询时,经常这么干 result := bson.M{} err = c.Find(nil).One(&result) if err != nil { panic(err) } fmt.Println(result) // output: map[_id:ObjectIdHex("56fdce98189df8759fd61e5b") name:Tom age:20]} |
查找多条记录
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
func findMuit() { db := getDB() c := db.C("user") // 使用All方法,一次性消耗较多内存,如果数据较多,可以考虑使用迭代器 type User struct { Id bson.ObjectId `bson:"_id,omitempty"` Name string "bson:`name`" Age int "bson:`age`" } var users []User err := c.Find(nil).All(&users) if err != nil { panic(err) } fmt.Println(users) // output: [{ObjectIdHex("56fdce98189df8759fd61e5b") Tom 20}...] // 使用迭代器获取数据可以避免一次占用较大内存 var user User iter := c.Find(nil).Iter() for iter.Next(&user) { fmt.Println(user) } // output: // {ObjectIdHex("56fdce98189df8759fd61e5b") Tom 20} // {ObjectIdHex("56fdce98189df8759fd61e5c") Tom 20} // ...} |
查找指定字段
主要使用Select函数:
func (q *Query) Select(selector interface{}) *Query
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
func findField() { db := getDB() c := db.C("user") // 只读取name字段 type User struct { Name string "bson:`name`" } var users []User err := c.Find(bson.M{}).Select(bson.M{"name": 1}).All(&users) if err != nil { panic(err) } fmt.Println(users) // output: [{Tom} {Tom} {Anny}...] // 只排除_id字段 type User2 struct { Name string "bson:`name`" Age int "bson:`age`" } var users2 []User2 err = c.Find(bson.M{}).Select(bson.M{"_id": 0}).All(&users2) if err != nil { panic(err) } fmt.Println(users2) // output: [{Tom 20} {Tom 20} {Anny 28}...]} |
查询嵌套格式数据
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
func findNesting() { db := getDB() c := db.C("user") // 使用嵌套的struct接收数据 type User struct { Name string "bson:`name`" Age int "bson:`age`" Toys []struct { Name string "bson:`name`" } } var users User // 只查询toys字段存在的 err := c.Find(bson.M{"toys": bson.M{"$exists": true}}).One(&users) if err != nil { panic(err) } fmt.Println(users) // output: {Tom 20 [{dog}]}} |
查找数据总数
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
func count() { db := getDB() c := db.C("user") // 查找表总数 count, err := c.Count() if err != nil { panic(err) } fmt.Println(count) // output: 8 // 结合find条件查找 count, err = c.Find(bson.M{"name": "Tom"}).Count() if err != nil { panic(err) } fmt.Println(count) // output: 6} |
对数据进行排序
使用Sort函数
func (q *Query) Sort(fields ...string) *Query
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
func findSort() { db := getDB() c := db.C("user") type User struct { Id bson.ObjectId `bson:"_id,omitempty"` Name string "bson:`name`" Age int "bson:`age`" } var users []User // 按照age字段降序排列,如果升序去掉横线"-"就可以了 err := c.Find(nil).Sort("-age").All(&users) if err != nil { panic(err) } fmt.Println(users) // output: // [{ObjectIdHex("56fdce98189df8759fd61e5d") Anny 28} ...] // ...} |
分页查询
使用Skip函数和Limit函数
func (q *Query) Skip(n int) *Query
func (q *Query) Limit(n int) *Query
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
func findPage() { db := getDB() c := db.C("user") type User struct { Id bson.ObjectId `bson:"_id,omitempty"` Name string "bson:`name`" Age int "bson:`age`" } var users []User // 表示从偏移位置为2的地方开始取两条记录 err := c.Find(nil).Sort("-age").Skip(2).Limit(2).All(&users) if err != nil { panic(err) } fmt.Println(users) // output: // [{ObjectIdHex("56fdce98189df8759fd61e5d") Anny 20} ...] // ...} |
golang mongodb查找find demo的更多相关文章
- Golang+Mongodb
Golang+Mongodb打造你的第一个站点 很多人推荐MEAN来开发站点.MEAN就是M:mongodb,E:expressjs.A:angular最后的N:nodejs. 但是如果你亲身的体会到 ...
- 使用Golang+Mongodb打造你的第一个站点
很多人推荐MEAN来开发站点.MEAN就是M:mongodb,E:expressjs.A:angular最后的N:nodejs. 但是如果你亲身的体会到了js的嵌套回调的话你就会想换换别的办法了.虽然 ...
- golang mongodb (mgo)插入或读取文档的字段值为空(nil)问题解决
问题描述 当使用mgo操作mongodb时,遇到数据插入正常,但是在数据库查看时只能看到objectid被插入了:读取的时候,可以查询到记录,但是读入对象时,却所有的值均为0或者空的情况. mongo ...
- MongoDB系列:三、springboot整合mongoDB的简单demo
在上篇 MongoDB常用操作练习 中,我们在命令提示符窗口使用简单的mongdb的方法操作数据库,实现增删改查及其他的功能.在本篇中,我们将mongodb与spring boot进行整合,也就是在j ...
- 二分查找法demo
正文 中午闲着有点时间,做个demo睡觉去,这个例子网上应该都有,自己只是敲一下给自己做个记录. public static void main(String[] args) { int[] whit ...
- 使用express框架和mongoose在MongoDB查找数据
1.创建Schema var schema = new mongoose.Schema({ userName:{type:String,require:true}, age:{type:Number, ...
- 开源一个最近写的spring与mongodb结合的demo(spring-mongodb-demo)
由于工作需要,给同事们分享了一下mongodb的使用,其中主要就是做了一个spring-data+mongodb的小例子,本着分享的精神,就上传到了github.com上,有需要的同学请移步githu ...
- MongoDB查找条件
1. 关系运算符 $eq 等于 $lt 小于 $lte 小于等于 $gt 大于 $gte 大于等于 $in 在范围内 //查询名字为“小明”和“小刚”的 $condition = [ ' ...
- golang 实现海明距离 demo
Simhash的算法简单的来说就是,从海量文本中快速搜索和已知simhash相差小于k位的simhash集合,这里每个文本都可以用一个simhash值来代表,一个simhash有64bit,相似的文本 ...
随机推荐
- Hadoop 添加删除Slave
Hadoop 添加删除Slave @(Hadoop) 在hdfs-site.xml文件中添加如下配置: <property> <name>dfs.hosts</name& ...
- Codeforces 112A-Petya and Strings(实现)
A. Petya and Strings time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- CSS学习(九)-CSS背景
一.理论: 1.background-break a.bounding-box 背景图像在整个内联元素中进行平铺 b.each-box 背景图像在行内中进行平铺 c.continuous 下一行的背 ...
- Chrome扩展之css used 获取网页样式
地址栏输入: chrome://extensions/ 然后获取更多扩展程序,得到css used 复制html节点 最后点击 "css used" 把样式全部复制下来即可 (记住 ...
- unity3d格式的导出与加载
http://blog.csdn.net/nateyang/article/details/7567831 1.导出.unity3d格式资源: http://game.ceeger.com/Scrip ...
- CSS3文本溢出
text-overflow: text-overflow:clip | ellipsis; clip:剪切多余的文字. ellipsis:文本溢出时显示省略标记. 要实现文本溢出剪切显示省略标记,还需 ...
- FAT AP v200R005 配置二层透明模式(web&命令行,开局)
背景: vlan123:用户业务vlan,192.168.1.0/24 Vlan2001:管理vlan,172.168.129.0/24 vlan1:默认vlan,不建议使用. 注意事项: 配置服务集 ...
- 【原创】说说JSON和JSONP,也许你会豁然开朗,含jQuery用例
说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决?这两个问题目前都有不同的解决方案,比如数据可以用自定义字符串或者用XML来描述,跨域可以通过服 ...
- Hibernate 操作 oracle数据库,报错总结
1.ORA-00957: 重复的列名 错误信息如下: Hibernate: insert into T_RESOURCE (NAME, NUM, PARENT_FLAG, PARENT_ID, id, ...
- 特征组合&特征交叉
https://segmentfault.com/a/1190000014799038 https://www.jianshu.com/p/fc96675b6f8e https://blog.csdn ...