Nós também podemos inserir objetos utilizando o save
, ele tanto insere como altera valores.
var pokemon = {'name':'Caterpie','description':'Larva lutadora','type': 'inseto', attack: 30, height: 0.3 }
suissacorp(mongod-3.0.6) be-mean-instagram> db.pokemons.save(pokemon)
Inserted 1 record(s) in 1ms
WriteResult({
"nInserted": 1
})
Depois listamos para conferir:
db.pokemons.find()
{
"_id": ObjectId("564220f0613f89ac53a7b5d0"),
"name": "Pikachu",
"description": "Rato elétrico bem fofinho",
"type": "electric",
"attack": 100,
"height": 0.4
}
{
"_id": ObjectId("56422345613f89ac53a7b5d1"),
"name": "Bulbassauro",
"description": "Chicote de trepadeira",
"type": "grama",
"attack": 49,
"height": 0.4
}
{
"_id": ObjectId("56422345613f89ac53a7b5d2"),
"name": "Charmander",
"description": "Esse é o cão chupando manga de fofinho",
"type": "fogo",
"attack": 52,
"height": 0.6
}
{
"_id": ObjectId("56422345613f89ac53a7b5d3"),
"name": "Squirtle",
"description": "Ejeta água que passarinho não bebe",
"type": "água",
"attack": 48,
"height": 0.5
}
{
"_id": ObjectId("56422705613f89ac53a7b5d4"),
"name": "Caterpie",
"description": "Larva lutadora",
"type": "inseto",
"attack": 30,
"height": 0.3
}
Fetched 5 record(s) in 40ms
Para alterarmos um valor com save
, precisamos inicialmente buscar o objeto desejado com findOne
, pois ele me retorna apenas o primeiro objeto achado. Caso eu usasse o find
, mesmo retornando um objeto, ainda seria dentro de um Array.
Por isso usamos o find
para listagem de registros e o findOne
para consulta de registros.
Veja a diferença de retorno das duas funções:
var query = {name: 'Caterpie'}
suissacorp(mongod-2.4.8) be-mean> var p = db.pokemons.find(query)
suissacorp(mongod-3.0.6) be-mean-instagram> p
{
"_id": ObjectId("56422705613f89ac53a7b5d4"),
"name": "Caterpie",
"description": "Larva lutadora",
"type": "inseto",
"attack": 30,
"height": 0.3
}
Fetched 1 record(s) in 1ms
suissacorp(mongod-3.0.6) be-mean-instagram> p.name
suissacorp(mongod-3.0.6) be-mean-instagram>
Não conseguimos acessar diretamente nosso objeto pois ele é retornado na forma de cursor, que possui métodos especiais para acessar seus valores, como visto aqui.
Então precisamos utilizar o findOne
pois ele retorna um objeto comum.
var p = db.pokemons.findOne(query)
suissacorp(mongod-3.0.6) be-mean-instagram> p
{
"_id": ObjectId("56422705613f89ac53a7b5d4"),
"name": "Caterpie",
"description": "Larva lutadora",
"type": "inseto",
"attack": 30,
"height": 0.3
}
suissacorp(mongod-3.0.6) be-mean-instagram> p.name
Caterpie
suissacorp(mongod-3.0.6) be-mean-instagram> p.defense = 35
35
suissacorp(mongod-3.0.6) be-mean-instagram> p
{
"_id": ObjectId("56422705613f89ac53a7b5d4"),
"name": "Caterpie",
"description": "Larva lutadora",
"type": "inseto",
"attack": 30,
"height": 0.3,
"defense": 35
}
suissacorp(mongod-3.0.6) be-mean-instagram> db.pokemons.save(p)
Updated 1 existing record(s) in 2ms
WriteResult({
"nMatched": 1,
"nUpserted": 0,
"nModified": 1
})