详解Golang使用MongoDB通用操作

mongodb是nosql中常用的一种数据库,今天笔者就简单总结一下golang如何使用这些通用的供能的,不喜勿喷。。。

       研究的事例结构如下:

type likebest struct {
 authorname string `bson:"authorname,omitempty"`
 bookname  string `bson:"bookname,omitempty"`
 publishtime string `bson:"publishtime,omitempty"`
 lastreadtime string `bson:"lastreadtime,omitempty"`
}

type personnal struct {
 username  string  `bson:"username,omitempty"`
 wherecity  string  `bson:"wherecity,omitempty"`
 bookscount int  `bson:"bookscount,omitempty"`
 favoritebooks []likebest `bson:"favoratebooks,omitempty"`
}

建立与mongodb的连接

 session, err := mgo.dial("localhost:27017")
 if err != nil {
  panic(err)
 }
 defer session.close()

 c := session.db("personmanage").c("persons")

注意:以下操作条件默认均为:username=”impressionw”

插入数据

1、使用insert()函数是最简单且通用的方式

err := c.insert(&p) //p为插入的结构体数据

2、使用upsert()函数【更新或插入】

change := mgo.change{
  update: bson.m{"$set": p},
  returnnew: false,
  remove: false,
  upsert: true,
}
_, err := c.find(bson.m{"username": "impressionw"}).apply(change, nil)

       或许,你觉得第一种方式更简洁,但是实际场景中,第二种也非常实用
        1. 它不仅只能插入数据,update字段可以接收多个参数插入,但是关键字不能相同【不能同时有2个”$set”】
        2. 它能返回处理前或处理后的document,若返回,则apply的第二个参数即是结果
        3. 它可以结合select使用

注意:$set 只修改指定字段的值,不影响其他值

查询数据

1、查询整个文档

err = c.find(bson.m{"username": "impressionw"}).one(&result)

2、只返回 favoritebooks 对应的字段,忽略其他信息
    这里用到了select(),select可以设置,返回的内容:

select{‘filedname':0},表示忽略该字段则结果不返回此字段
select{‘filedname':1},表示关注该字段则只返回关注字段
err = c.find(bson.m{"username": "impressionw"}).select(bson.m{"favoratebooks": 1}).one(&result)

3、查询文档的_id

var result interface{}
err = c.find(bson.m{"username": "impressionw"}).select(bson.m{"_id": 1}).one(&result)

var document_id string
switch value := result.(type) {
case bson.m:
 mapid := value["_id"]
 if mapid != nil {
  id := mapid.(bson.objectid)
  document_id = id.hex()
 }
}

注意:若是查找username含有”impressionw”的文档,可用正则匹配查找,条件这样写:

query = bson.m{"username": bson.m{"$regex": "impressionw"}}

4、查询数组中匹配元素,只返回含有匹配元素的文档,需要用到mongdob的聚合aggregate

    相关操作符的含义如下:

  • $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
  • match:用于过滤数据,只输出符合条件的文档。match使用mongodb的标准查询操作。
  • $limit:用来限制mongodb聚合管道返回的文档数。
  • $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
  • $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
  • $group:将集合中的文档分组,可用于统计结果。
  • $sort:将输入文档排序后输出。
  • $geonear:输出接近某一地理位置的有序文档。

下面的代码,将只返回favoratebooks字段中,bookname为”the go programming language”的书籍,且只关注favoratebooks,不会输出个人信息

pipe := c.pipe([]bson.m{{"$unwind": "$favoratebooks"},
  {"$match": bson.m{"username": "impressionw", "favoratebooks.bookname": "the go programming language"}},
  {"$project": bson.m{"favoratebooks": 1}}})
resp := []bson.m{}
err := pipe.all(&resp)

这样可以达到目的了

更新文档

1、更新wherecity字段—关键字 $set,将wherecity修改为”shanghai“:

err = c.update(bson.m
{"username": "impressionw"
}, 
bson.m{"$set": bson.m
{"wherecity": "shanghai"
}})

2、更新favoritebooks中的lastreadtime字段

   查询条件:username=”impressionw”、bookname=”the go programming language”,将lastreadtime字段更改为:”oct 26, 2017”

change := mgo.change{
  update: bson.m{"$set": bson.m{"favoratebooks.$.lastreadtime": "oct 26, 2017"}},
  returnnew: false,
  remove: false,
  upsert: true,
 }
query := bson.m{"username": "impressionw", "favoratebooks": bson.m{"$elemmatch": bson.m{"bookname": "the go programming language"}}}
_, err = c.find(query).select(bson.m{"favoratebooks.bookname": 1}).apply(change, nil)

3、更新一个 favoritebooks 的整个数组文档,即新增一本书的信息
      给username=”impressionw”的文档新增一条书籍记录,同时将bookscount字段自增1

act := []likebest{
 likebest{
  authorname: "yuhen",
  bookname:  "go learning",
  publishtime: "dec 27, 2014",
  lastreadtime: "dec 29, 2016",
 },
}
change := mgo.change{
 update: bson.m{"$inc": bson.m{"bookscount": 1}, "$push": bson.m{"favoratebooks": bson.m{"$each": act}}},
 returnnew: false,
 remove: false,
 upsert: true,
}
_, err := c.find(bson.m{"username": "impressionw"}).apply(change, nil)

注意:

1、此处可用addtoset代替push,addtoset不会添加已有的数据,push 会添加重复的数据,可以分别应用于不同场景
2、$inc 对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作, 值为正数表示自增,值为负数表示自减

删除文档

1、删除喜欢的一本书籍信息,同时喜欢书记数量自减1

var option = bson.m
{"$pull": bson.m{"favoratebooks": bson.m{"bookname": "go learning"}}, 
"$inc": bson.m{"bookscount": -1}}
err := c.update(bson.m{"username": "impressionw"}, option)

2、删除所有喜欢的书籍,同时将bookscount字段置为 0

var data = bson.m{"$unset": bson.m
{"favoratebooks": true},
 "$set": bson.m{"bookscount": 0}}
err = c.update(bson.m
{"username": "impressionw"}, data)

3、删除整个文档,根据”_id”字段删除文档

err := session.db("personmanage").c("persons").remove(bson.m
{"_id":bson.objectidhex("

到此这篇关于详解golang使用mongodb通用操作的文章就介绍到这了,更多相关golang使用mongodb通用操作内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐