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 | ||
![]() | ![]() | ![]() |