使用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的更多相关文章

  1. Golang+Mongodb

    Golang+Mongodb打造你的第一个站点 很多人推荐MEAN来开发站点.MEAN就是M:mongodb,E:expressjs.A:angular最后的N:nodejs. 但是如果你亲身的体会到 ...

  2. 使用Golang+Mongodb打造你的第一个站点

    很多人推荐MEAN来开发站点.MEAN就是M:mongodb,E:expressjs.A:angular最后的N:nodejs. 但是如果你亲身的体会到了js的嵌套回调的话你就会想换换别的办法了.虽然 ...

  3. golang mongodb (mgo)插入或读取文档的字段值为空(nil)问题解决

    问题描述 当使用mgo操作mongodb时,遇到数据插入正常,但是在数据库查看时只能看到objectid被插入了:读取的时候,可以查询到记录,但是读入对象时,却所有的值均为0或者空的情况. mongo ...

  4. MongoDB系列:三、springboot整合mongoDB的简单demo

    在上篇 MongoDB常用操作练习 中,我们在命令提示符窗口使用简单的mongdb的方法操作数据库,实现增删改查及其他的功能.在本篇中,我们将mongodb与spring boot进行整合,也就是在j ...

  5. 二分查找法demo

    正文 中午闲着有点时间,做个demo睡觉去,这个例子网上应该都有,自己只是敲一下给自己做个记录. public static void main(String[] args) { int[] whit ...

  6. 使用express框架和mongoose在MongoDB查找数据

    1.创建Schema var schema = new mongoose.Schema({ userName:{type:String,require:true}, age:{type:Number, ...

  7. 开源一个最近写的spring与mongodb结合的demo(spring-mongodb-demo)

    由于工作需要,给同事们分享了一下mongodb的使用,其中主要就是做了一个spring-data+mongodb的小例子,本着分享的精神,就上传到了github.com上,有需要的同学请移步githu ...

  8. MongoDB查找条件

    1. 关系运算符 $eq 等于 $lt    小于 $lte 小于等于 $gt   大于 $gte 大于等于 $in   在范围内 //查询名字为“小明”和“小刚”的 $condition = [ ' ...

  9. golang 实现海明距离 demo

    Simhash的算法简单的来说就是,从海量文本中快速搜索和已知simhash相差小于k位的simhash集合,这里每个文本都可以用一个simhash值来代表,一个simhash有64bit,相似的文本 ...

随机推荐

  1. 亲測,Eclipse报"An error has occurred,See error log for more details. java.lang.NullPointerException"

    Eclipse报"An error has occurred,See error log for more details. java.lang.NullPointerException&q ...

  2. .Net Framework 之 托管模块与程序集的关系

    一.基本概念: --托管模块:一个标准的32的可移植执行体(PE32)文件或一个标准的64位可移植执行体(PE32+)文件.由用支持CLR的任何一种语言创建的源代码文件,再经过相应的编译器检查语法和分 ...

  3. .NET Framwork 之 托管代码的执行过程

    源代码代码第一次编译形成IL中间语言的托管代码,在运行时被Class Loader装载后进行JIT第二次编译形成托管的本地代码.在执行过程中,它会不断地检查当前我们执行的代码的安全性和规范性. Cla ...

  4. Why do Antennas Radiate?

    Obtaining an intuitive idea for why antennas radiate is helpful in understanding the fundamentals of ...

  5. 自己Cookie写的自动登录功能 包含BASE64 和MD5的使用

    sql表 username  password字段 User类 有 id username password等字段 Service有一函数 @Override public User findUser ...

  6. 键盘enter按钮出发登陆事件

    $("#nameInput").focus();$(".txtUserName").keydown(function (event) { if (event.k ...

  7. 使用Python SDK管理Azure Load Balancer

    概述 下面将演示如何使用Python SDK管理中国区Azure Load balancer.关于Azure负载均衡器的详细功能介绍,请参考官方文档. Code Sample import os fr ...

  8. SQL语句创建相同结构的表

    --Oracle的语句create table sa_salaryRecord as select * from sa_salary where 1=2; --MSSQL的语句select * int ...

  9. 折腾docker安装笔记

    最近尝试把netcore迁移到docker,然后在本地虚拟机尝试装下 发现yum安装好复杂 于是记录下 1.7.2 centos的ios装虚拟机 2.修改网络 配置文件 查看网络地址 然后xshell ...

  10. Yii Framework2.0开发教程(3)数据库mysql入门

    沿用教程(2)的代码 第一步.在本地mysql数据库中新建数据库zhyoulun 第二步.在数据库中新建表并插入若干条数据 CREATE TABLE `country` ( `code` CHAR(2 ...