save

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
})