-
-
Save border/3489566 to your computer and use it in GitHub Desktop.
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) | |
} |
how can you query all people in the table?
@geraldstanje to query all people in the table you can do :
err = c.Find(nil).Sort("-timestamp").All(&results)
if err != nil {
panic(err)
}
fmt.Println("Results All: ", results)
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)
}
c.Insert(&Person{Name: "Ale", Phone: "+55 53 1234 4321", Timestamp: time.Now()})
Mongodb auto generate _id, how to get it?
@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
@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
Can you post example of update by ID ?
err := c.UpdateId(id, bson.M{"$set": bson.M{"name": "updated name"}})
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()
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!
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.
@suwarnold, look at mgo.DialInfo{} and mgo.DialWithInfo()
Thank You for the post!
for some reason, c.Insert()
insert nothing and no error is returned :S
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.
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 ?
You can also do
if err := c.Update(colQuerier, change); err != nil {
// panic(err) <-- one way, or:
w.WriteHeader(404)
return
}
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.
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
Thanks a lot
thanks
how to connect mongodb+srv ?
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/
it would be so nice if we could pass a golang struct in the find
method (the same struct which we inserted).
thanks for this
Excellent.
Thx for posting.