Relacionamentos Mongodb

Vamos entender como o MongoDB trabalha com relacionamento de dados. Basicamente veremos como podemos relacionar os dados usando uma ideia parecida com chaves estrangeiras.

Não existe JOINS (Por hora, veja o blog do Christiano Anderson falando mais sobre esse assunto)

Para realizarmos relacionamentos precisamos salvar o _id de uma coleção em outra. Exemplo, vamos buscar 3 dados aleatórios, nesse caso estou usando minha base pokemon. Para obte-la basta acessar aqui

> db.pokemons.find({}, {name:1}).limit(3).pretty()
{ "_id" : ObjectId("564b1dad25337263280d0479"), "name" : "Rattata" }
{ "_id" : ObjectId("564b1dad25337263280d047b"), "name" : "Charmeleon" }
{ "_id" : ObjectId("564b1dad25337263280d047a"), "name" : "Charmander" }

Vamos montar um array com os _id’s

var pokemons = [
	{ "_id" : ObjectId("564b1dad25337263280d0479")},
	{ "_id" : ObjectId("564b1dad25337263280d047b")},
	{ "_id" : ObjectId("564b1dad25337263280d047a")}
]

Agora criaremos um json contendo os meus pokemos

> var json = {name: "Meus pokemons", pokemons: pokemons}
> json
{
        "name" : "Meus pokemons",
        "pokemons" : [
                {
                        "_id" : ObjectId("564b1dad25337263280d0479")
                },
                {
                        "_id" : ObjectId("564b1dad25337263280d047b")
                },
                {
                        "_id" : ObjectId("564b1dad25337263280d047a")
                }
        ]
}

Inserindo meus pokemons em uma coleção chamada inventario (inv)

> db.invt.insert(json)
WriteResult({ "nInserted" : 1 })
> db.invt.find().pretty()
{
        "_id" : ObjectId("5658f9955c8f9760464e2b96"),
        "name" : "Meus pokemons",
        "pokemons" : [
                {
                        "_id" : ObjectId("564b1dad25337263280d0479")
                },
                {
                        "_id" : ObjectId("564b1dad25337263280d047b")
                },
                {
                        "_id" : ObjectId("564b1dad25337263280d047a")
                }
        ]
}

Agora como vamos buscar os dados dos pokemons? Para isso vamos utilizar um javascript, que o mongodb já aceita nativamente, para isso.

> var pokemons = []
> var getPokemon = function(id){pokemons.push(db.pokemons.findOne(id))}
> var invt = db.invt.findOne()
> invt
{
        "_id" : ObjectId("5658f9955c8f9760464e2b96"),
        "name" : "Meus pokemons",
        "pokemons" : [
                {
                        "_id" : ObjectId("564b1dad25337263280d0479")
                },
                {
                        "_id" : ObjectId("564b1dad25337263280d047b")
                },
                {
                        "_id" : ObjectId("564b1dad25337263280d047a")
                }
        ]
}
> invt.pokemons.forEach(getPokemon)

Com isso temos os seguintes resultados no array pokemons

> pokemons
[
        {
                "_id" : ObjectId("564b1dad25337263280d0479"),
                "attack" : 56,
                "created" : "2013-11-03T15:05:41.305777",
                "defense" : 35,
                "height" : "3",
                "hp" : 30,
                "name" : "Rattata",
                "speed" : 72,
                "types" : [
                        "normal"
                ]
        },
        {
                "_id" : ObjectId("564b1dad25337263280d047b"),
                "attack" : 64,
                "created" : "2013-11-03T15:05:41.273462",
                "defense" : 58,
                "height" : "11",
                "hp" : 58,
                "name" : "Charmeleon",
                "speed" : 80,
                "types" : [
                        "fire"
                ]
        },
        {
                "_id" : ObjectId("564b1dad25337263280d047a"),
                "attack" : 52,
                "created" : "2013-11-03T15:05:41.271082",
                "defense" : 43,
                "height" : "6",
                "hp" : 39,
                "name" : "Charmander",
                "speed" : 65,
                "types" : [
                        "fire"
                ]
        }
]

A partir da nossa entidade guardada iniciamos em na coleção invt conectamos na collection db.pokemons e buscamos todos os pokemons com o _id armazenado.

Pô, que dahora isso!! Mas eu vou fazer na mão? Não para isso podemos usar o Mongoose que basicamente fará isso para nós.

DBRef

O DRef e uma convenção. Basicamente ele regulamenta a utilização de padrões para identificações de chaves em um documento de vindo de diferentes coleções. Como assim? Vamos dizer, com um exemplo vem “mais ou menos” que é a forma como nomemos os nomes de nossos campos no documentos vindo de uma outra coleção. Seria a nossa chave estrangeira em um banco relacional. Porém nem tudo são flores, nem todos os drives utilizam desse padrão.

Seu padrão o seguinte

{ "$ref" : <value>, "$id" : <value>, "$db" : <value> }

Onde:

$ref: é o nome da coleção; $id: é o objectId do documento referenciado; $db: é a base onde a coleção se encontra;

Compartilhe

Back