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,相似的文本 ...
随机推荐
- 转:windows BAT 批处理脚本教程
转自:http://www.cnblogs.com/mq0036/p/3412171.html BAT 批处理脚本教程 第一章 批处理基础第一节 常用批处理内部命令简介 批处理定义:顾名思义,批处理文 ...
- Hibernate从入门到上手(纯java project、Maven版本hibernate)
Hibernate(orm框架)(开放源代码的对象关系映射框架) Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一 ...
- js 终止 forEach 循环
1.因为 forEach() 无法通过正常流程终止,所以可以通过抛出异常的方式实现终止. try{ var array = ["first","second", ...
- Java学习笔记1、常用dos命令
cd 改变当前目录 sys 制作DOS系统盘 copy 拷贝文件 del 删除文件 deltree 删除目录树 dir 列文件名 diskcopy 制磁盘 edit 文本编辑 format ...
- Pygame制作答题类游戏的实现
代码地址如下:http://www.demodashi.com/demo/13495.html 概述 个人比较喜欢玩这些答题类的游戏,在这类的游戏中其实存在着一些冷知识在里面.练习pygame的过程中 ...
- Android逆向之旅---SO(ELF)文件格式详解(转)
第一.前言 从今天开始我们正式开始Android的逆向之旅,关于逆向的相关知识,想必大家都不陌生了,逆向领域是一个充满挑战和神秘的领域.作为一名Android开发者,每个人都想去探索这个领域,因为一旦 ...
- linuxshell中"2>&1"含义
http://blog.sina.com.cn/s/blog_652819220100wpvu.html
- 浅析C#中 ConcurrentDictionary的实现
简单画了一张图 (灵魂画手 →_→) 如图 ConcurrentDictionary 其中有个tables 对象主要存储,而这个 tables 是一个 很多区块的 数组 ,每个区块 又是一个node的 ...
- ContentObserver与DatasetObserver区别
1. ContentObserver ContentObserver主要是通过Uri来监测特定的Databases的表,如果该Databases表有变动则会通知更新cursor中的数据. 如果 ...
- STL容器分析--deque
deque,故名思义,双向队列.可以在头尾进行插入删除. 而STL中采用了链表+线性表的数据结构来实现deque,因而除了满足双向队列的特点以外,还支持随机访问. 下面,贴一段代码. 总览:双向队列是 ...