Abaixo está o meu código
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
var Cat = mongoose.model('Cat', {
name: String,
age: {type: Number, default: 20},
create: {type: Date, default: Date.now}
});
Cat.findOneAndUpdate({age: 17}, {$set:{name:"Naomi"}},function(err, doc){
if(err){
console.log("Something wrong when updating data!");
}
console.log(doc);
});
Eu já tenho algum registro no meu banco de dados mongo e gostaria de executar esse código para atualizar o nome para a idade de 17 anos e depois imprimir o resultado no final do código.
No entanto, por que ainda recebo o mesmo resultado do console (não o nome modificado), mas quando vou para a linha de comando do mongo db e digito " db.cats.find();
". O resultado veio com nome modificado.
Então volto a executar esse código novamente e o resultado é modificado.
Minha pergunta é: se os dados foram modificados, por que ainda obtive dados originais na primeira vez em que console.log os dados.
{ returnOriginal: false }
Para qualquer um usando o driver Node.js vez de Mongoose, você vai querer usar
{returnOriginal:false}
em vez de{new:true}
.fonte
Portanto, "findOneAndUpdate" requer uma opção para retornar o documento original. E, a opção é:
Shell MongoDB
{returnNewDocument: true}
Ref: https://docs.mongodb.com/manual/reference/method/db.collection.findOneAndUpdate/
Mangusto
{new: true}
Ref: http://mongoosejs.com/docs/api.html#query_Query-findOneAndUpdate
API do driver MongoDB do Node.js:
{returnOriginal: false}
Ref: http://mongodb.github.io/node-mongodb-native/3.0/api/Collection.html#findOneAndUpdate
fonte
'returnDocument' => FindOneAndUpdate::RETURN_DOCUMENT_AFTER
Por padrão, findOneAndUpdate retorna o documento original. Se você deseja retornar o documento modificado, passe um objeto de opções
{ new: true }
para a função:fonte
_id
nulo?Para quem se deparou com isso usando o estilo ES6 / ES7 com promessas nativas, aqui está um padrão que você pode adotar ...
fonte
Este é o código atualizado para
findOneAndUpdate
. Funciona.fonte
Mantenedor de mangusto aqui. Você precisa definir a
new
opção paratrue
(ou, equivalentemente,returnOriginal
parafalse
)Consulte os documentos do Mongoose
findOneAndUpdate()
e este tutorial sobre atualização de documentos no Mongoose .fonte
Se você quiser devolver o documento alterado, precisará definir a
{new:true}
referência da API da opção que pode usarCat.findOneAndUpdate(conditions, update, options, callback) // executes
Tomado pela API oficial do Mongoose http://mongoosejs.com/docs/api.html#findoneandupdate_findOneAndUpdate, você pode usar os seguintes parâmetros
Outra implementação que não está expressa na página oficial da API e é o que eu prefiro usar é a
Promise
implementação básica que permite que você tenha.catch
onde você pode lidar com todos os seus vários erros lá.fonte
Abaixo mostra a consulta para mangusto
findOneAndUpdate
. Aquinew: true
é usado para obter o documento atualizado efields
é usado para obter campos específicos.por exemplo.
findOneAndUpdate(conditions, update, options, callback)
fonte
Eu sei, eu já estou atrasado, mas deixe-me adicionar minha resposta simples e prática aqui
fonte