使用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. 转: 学ppt的网址与素材

    转:http://www.jianshu.com/p/89b261e0b8f6 你说你要学ppt,可你知道这些吗?   之前身边的同学总说做PPT很难,每次做ppt都头疼,我都对此很不屑,直到前一段开 ...

  2. 爪哇国新游记之十四----初试JDBC

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...

  3. java中compareTo和compare方法之比较,集合中对象的比较

    前言 转自:http://www.cnblogs.com/yueliming/archive/2013/05/22/3092576.html (这里做了一些小改动) 一直一来对集合中对象的比较方案,有 ...

  4. P2P网络借贷系统-核心功能-用户投标-业务解说

    用户投标是P2P网络借贷系统的核心功能.相对照较复杂,为了更好地梳理业务和技术实现思路,特地具体总结分析下. 输入:用户id-uid.标的id-lid.投标金额-amount 1.依据lid,获得贷款 ...

  5. webpack安装以及一些配置

    在用webpack之前... 或说没有实现组件化之前的web1.0时代! 最终迈向web2..0之后的时代! ===============华丽的分割线================== 安装步骤有 ...

  6. Entity Framework底层操作封装V2版本号(1)

    由于同志们一直给我提建议说.曾经发的版本号有问题.所以经过了我这一年多的使用和扩展,如今方法基本稳定了. 如今贴出来给大家使用: 首先上场的是数据库操作层: using System; using S ...

  7. ubuntu14.04使用root用户登录桌面,ubuntu14.04root 转

    ubuntu安装好之后,默认是不能用root用户登录桌面的,只能使用普通用户或者访客登录.怎样开启root用户登录桌面呢? 先用普通用户登录,然后切换到root用户,然后执行如下命令: vi /usr ...

  8. jQuery基本选择 元素

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  9. HTML5&amp;CSS3初学者指南

    介绍 网络时代已经到来.现在对人们来说,每天上网冲浪已经成为一种最为常见的行为. 一个典型的网页是由文本.图像和链接组成的.除去内容上的差异,不同网站的网页也具有不同的外观和感受,以实现在网络上建立自 ...

  10. Chrome应用技巧之颜色拾取

    之前在Chrome应用店找了个插件实现拾色功能.并且很不理想.不知道是不是曾经Chrome自带的开发工具没提供到拾色功能还是我没发现.今天无意中发现Chomer自带的开发工具可拾色,请看以下的GIF动 ...