mgo (mango): MongoDB pra Go

#MongoSP, 2011

Gustavo Niemeyer

Agenda

Olá!

Go

Já tive linguagens,
de todas as cores ...

Então, por quê?

Nada de novo no Go

A soma das partes.

package main

func main() {
	s := "Hello Go!"
	println(s)
}

mgo

Go + MongoDB == <3

mgo entre 10 mais utilizadas

Características únicas

Vamos lá...

Sessões

package main

import "mgo"

func main() {
	session, err := mgo.Mongo("db1.example.com")
	c := session.DB("mydb").C("mycollection")
	query := c.Find(bson.M{"name": "Jorge"})
	...
}

Sessões

Controle de consistência

package main

import "mgo"

func main() {
	...
	session.SetMode(mgo.Monotonic, true)
	...
}

Controle de consistência

Cópia de sessões

package main

import "mgo"

func main() {
	...
	other := session.Copy()
	other.SetMode(mgo.Monotonic, true)
	f(other)
	...
}

Pre-fetching

package main

import "mgo"

func main() {
	...
	session.SetBatch(200)
	session.SetPrefetch(0.25)
	...
}

Iteração simplificada

package main

import "mgo"

func main() {
	...
	err := iter.For(&result, func() os.Error {
		println(result.N)
		return nil
	})
	...
}

Tipagem confortável

type Person struct {
	Name string
	Age int
	Nerd bool
}

func main() {
	...
	p := Person{}
	err := collection.Find(nil).One(&p)
	...
}

Autenticação integrada no cache

package main

import "mgo"

func main() {
	...
	err := session.DB("mydb").Login("user", "pass")
	...
	session.LogoutAll()
	...
}

Autenticação integrada no cache

Otimizado para concorrência

func f(s mgo.Session, name string) {
	result := Person{}
	c := session.DB("company").C("people")
	err := c.Find(bson.M{"name": name}).One(&result)
	...
}

func main() {
	...
	go f(session, name1)
	go f(session, name2)
	...
}

Otimizado para concorrência

Otimizado para concorrência

Otimizado para concorrência

Otimizado para concorrência

GridFS

package main

import "mgo"

func main() {
	...
	db := session.DB("mydb")
	file, err := db.GridFS("fs").Create("my.iso") 
	check(err) 
	defer file.Close()
	iso, err := os.Open("cd.iso") 
	check(err) 
	defer iso.Close() 
	err = ioutil.Copy(file, iso) 
	...
}

Excelente documentação

Realmente testado

Q&A