Skip to content

Instantly share code, notes, and snippets.

@border
Created August 27, 2012 15:33
Show Gist options
  • Save border/3489566 to your computer and use it in GitHub Desktop.
Save border/3489566 to your computer and use it in GitHub Desktop.
mgo example
package main
import (
"fmt"
"labix.org/v2/mgo"
"labix.org/v2/mgo/bson"
"time"
)
type Person struct {
ID bson.ObjectId `bson:"_id,omitempty"`
Name string
Phone string
Timestamp time.Time
}
var (
IsDrop = true
)
func main() {
session, err := mgo.Dial("127.0.0.1")
if err != nil {
panic(err)
}
defer session.Close()
session.SetMode(mgo.Monotonic, true)
// Drop Database
if IsDrop {
err = session.DB("test").DropDatabase()
if err != nil {
panic(err)
}
}
// Collection People
c := session.DB("test").C("people")
// Index
index := mgo.Index{
Key: []string{"name", "phone"},
Unique: true,
DropDups: true,
Background: true,
Sparse: true,
}
err = c.EnsureIndex(index)
if err != nil {
panic(err)
}
// Insert Datas
err = c.Insert(&Person{Name: "Ale", Phone: "+55 53 1234 4321", Timestamp: time.Now()},
&Person{Name: "Cla", Phone: "+66 33 1234 5678", Timestamp: time.Now()})
if err != nil {
panic(err)
}
// Query One
result := Person{}
err = c.Find(bson.M{"name": "Ale"}).Select(bson.M{"phone": 0}).One(&result)
if err != nil {
panic(err)
}
fmt.Println("Phone", result)
// Query All
var results []Person
err = c.Find(bson.M{"name": "Ale"}).Sort("-timestamp").All(&results)
if err != nil {
panic(err)
}
fmt.Println("Results All: ", results)
// Update
colQuerier := bson.M{"name": "Ale"}
change := bson.M{"$set": bson.M{"phone": "+86 99 8888 7777", "timestamp": time.Now()}}
err = c.Update(colQuerier, change)
if err != nil {
panic(err)
}
// Query All
err = c.Find(bson.M{"name": "Ale"}).Sort("-timestamp").All(&results)
if err != nil {
panic(err)
}
fmt.Println("Results All: ", results)
}
@kalashnikov
Copy link

In my case, var results []Person gave me empty result.

Instead, below solution works. Reference

var m []bson.M
_ = c.Find(nil).All(&m)
for _, v := range m {
    fmt.Println(v)
}

@nguyenthenguyen
Copy link

c.Insert(&Person{Name: "Ale", Phone: "+55 53 1234 4321", Timestamp: time.Now()})
Mongodb auto generate _id, how to get it?

@d4rk5eed
Copy link

d4rk5eed commented Aug 1, 2015

@nguyenthenguyen if you assign Person{Name: "Ale", Phone: "+55 53 1234 4321", Timestamp: time.Now()} to variable, for example person. Pass this variable to Insert function and after success execution you get person.Id

@d4rk5eed
Copy link

d4rk5eed commented Aug 1, 2015

@nguyenthenguyen sorry, I misled you.
After some research I found working one

type Person struct {
    ID        bson.ObjectId `bson:"_id,omitempty"`
    Name      string
    Phone     string
    Timestamp time.Time
}
//....
id = bson.NewObjectId()
c.Insert(&Person{ID: id, Name: "Ale", Phone: "+55 53 1234 4321", Timestamp: time.Now()})

You get correct mongo id in id

@paulocoutinhox
Copy link

Can you post example of update by ID ?

@xuqingfeng
Copy link

@prsolucoes

err := c.UpdateId(id, bson.M{"$set": bson.M{"name": "updated name"}})

@littlechad
Copy link

how do you know if its empty, i take it the this

if err != nil {
    panic(err)
}

doesn't necessarily mean that it is empty, does it?

nevermind, i would just do a Count()

@EwanValentine
Copy link

Thanks for these examples, they've been incredibly useful. Does anyone have any examples on insert subdocuments? Say if I had

type Article struct {
    Title string `form"title" json:"title"`
    Categories []*Category
}

How would I go about finding an article, and adding a category?

Thanks!

@suwarnold
Copy link

Hi guys,
If i have probably 4 server of mongodb. 1 server active(main), and the others server are slave which the active(main) server somehow can switch as slave, and slave can switch as active(main) automatic . how i develop the code to get only the active(main) server only? active(main) server means you can do add, remove, find process in that server only. Thanks before.

@blasterpistol
Copy link

@suwarnold, look at mgo.DialInfo{} and mgo.DialWithInfo()

@bsaideepak
Copy link

Thank You for the post!

@shackra
Copy link

shackra commented Aug 16, 2016

for some reason, c.Insert() insert nothing and no error is returned :S

@sandyydk
Copy link

sandyydk commented Sep 29, 2016

Hi All
change := bson.M{"$set": bson.M{"phone": "+86 99 8888 7777", "timestamp": time.Now()}}
I didn't get this part -- $set. What type is it? Or what are the other options in this?
I found this in docs --

change := mgo.Change{
        Update: bson.M{"$inc": bson.M{"n": 1}},
        ReturnNew: true,
}
info, err = col.Find(M{"_id": id}).Apply(change, &doc)
fmt.Println(doc.N)

I suppose inc stands for increment. But am not clear about the data type here(Interface?). Anyways again I suppose this is a fixed thing? But then that would contradict the next usage of bson.M...
Thanks in advance.

@mj073
Copy link

mj073 commented Nov 30, 2016

My Observation about UpdateAll() is, by default it upserts the record..
that means, if "phone" field from the change is not present in record, it will insert the field

change:= bson.M{"$set":bson.M{"phone": "+86 99 8888 7777", "timestamp": time.Now()}}

Is there a way to override the default upsert behaviour of UpdateAll() call ?

@iamclaytonray
Copy link

You can also do

if err := c.Update(colQuerier, change); err != nil {
  // panic(err) <-- one way, or:
  w.WriteHeader(404)
  return
}

@ShambhaviAdokar
Copy link

ShambhaviAdokar commented Aug 3, 2017

Hi All,
I am trying to access the record but its returning me empty record
code:
result := Person{}

	err = c.Find(bson.M{"first_name": "ABC"}).Select(bson.M{"userEmail": 1}).One(&result)
	if err != nil {
		panic(err)
	}
	fmt.Println("Email", result)

output :
Email { }

please help.

@LordRahl90
Copy link

Thanks for posting... learnt a lot..

Please is there a way to chain queries??? like where firstname is "anything" and lastname is "anything as well"

Thanks

@bussiere
Copy link

bussiere commented Apr 4, 2018

Thanks a lot

@neepoo
Copy link

neepoo commented Apr 16, 2019

thanks

@gaspan
Copy link

gaspan commented Jul 22, 2019

how to connect mongodb+srv ?

@kevinhide
Copy link

Hi guys,
If i have probably 4 server of mongodb. 1 server active(main), and the others server are slave which the active(main) server somehow can switch as slave, and slave can switch as active(main) automatic . how i develop the code to get only the active(main) server only? active(main) server means you can do add, remove, find process in that server only. Thanks before.

Checkout this : https://docs.mongodb.com/manual/reference/method/db.currentOp/

@chhabraamit
Copy link

it would be so nice if we could pass a golang struct in the find method (the same struct which we inserted).

@DasoTD
Copy link

DasoTD commented Jan 19, 2022

thanks for this

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment