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 main import ( "fmt" "gopkg.in/mgo.v2" "gopkg.in/mgo.v2/bson" ) // get mongodb db func 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,相似的文本 ...
随机推荐
- 把自动机用作 Key-Value 存储
以前只有代码,最近简单写了一点文档: google code 上的链接(总是最新) 自动机是什么 DFA 的最小化 将 DFA 用做字典 无环DFA (ADFA, Acyclic DFA) 编译 内存 ...
- 扩展JButton实现自己的图片按钮
实现效果: 代码: import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.In ...
- WCF 之 概述
WCF全称是Windows Communication Foundation,它是.NET3.0的重要组成部分,用来解决Windows下的一些通信方面的问题.WCF是Microsoft平台上的SOA架 ...
- 1000个经常使用的Python库和演示样例代码
以下是programcreek.com通过分析大量开源码,提取出的最经常使用的python库. 1. sys (4627) 2. os (4088) 3. re (3563) 4 ...
- webDriver API——第10部分Chrome WebDriver
class selenium.webdriver.chrome.webdriver.WebDriver(executable_path='chromedriver', port=0, chrome_o ...
- 修改tcp数据内容
http://blog.sina.com.cn/s/blog_6f0c85fb0100xi1x.html 2.6内核基于NetFilter处理框架修改TCP数据包实现访问控制 参考上面的钩子函数,结合 ...
- JAVA 解密pkcs7(smime.p7m)加密内容 ,公钥:.crt 私钥:.pem 使用Bouncy Castle生成数字签名、数字信封
第三方使用公钥.crt加密后返回的内容,需要使用私钥解密.pem 返回内容格式如下 MIME-Version: 1.0 Content-Disposition: attachment; filenam ...
- 理解和使用 Promise.all 和 Promise.race
一.Pomise.all的使用 Promise.all可以将多个Promise实例包装成一个新的Promise实例.同时,成功和失败的返回值是不同的,成功的时候返回的是一个结果数组,而失败的时候则返回 ...
- JavaWeb 发送post请求的2种方式(form、json)
JavaWeb 发送post请求的2种方式(form.json) CreationTime--2018年6月20日10点15分 Author:Marydon 前提:通过HttpClient来实现 ...
- Docker Container同时启动多服务 supervisor
Docker Container同时启动多服务 转载请注明来自:http://blog.csdn.net/wsscy2004 昨天踩了个天坑,我有一个基本的镜像centos6.5+ssh,是通过Doc ...