Deseja solicitar um recurso ou relatar um bug ?
Erro
Qual é o comportamento atual?
Model.findByIdAndUpdate() está emitindo um aviso de descontinuação para mongodb - que desativou collection.findAndModify. O Mongodb sugere usar findOneAndUpdate, findOneAndReplace ou findOneAndDelete.
collection.ensureIndex também está obsoleta - o mongodb sugere usar createIndexes em vez disso.
Se o comportamento atual for um bug, forneça as etapas para reproduzir.
Usar Model.findByIdAndUpdate / findOneAndUpdate para alterar um documento retorna esses avisos de depreciação.
Qual é o comportamento esperado?
Sem avisos de descontinuação!
Por favor, mencione sua versão node.js, mongoose e MongoDB.
Nó v10.8.0
mongodb v3.6.2
mangusto v5.2.9
Mesmo aqui. Também recebo "a opção de localizar [campos] está obsoleta e será removida em uma versão posterior".
(node:13076) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.
(node:13076) DeprecationWarning: collection.remove is deprecated. Use deleteOne, deleteMany, or bulkWrite instead.
(node:13076) DeprecationWarning: collection.find option [fields] is deprecated and will be removed in a later version.
(node:13076) DeprecationWarning: collection.update is deprecated. Use updateOne, updateMany, or bulkWrite instead.
Aqui estão alguns outros que eu tenho
Relacionado ao #6165 e pode ser reproduzido no teste CI
Você pode especificar useFindAndModify
como false para evitar mensagens de descontinuação parcial. IMO isso deve ser o padrão para false agora.
mongoose.set('useFindAndModify', false);
No entanto, outros métodos obsoletos como ensureIndex(es)
e update
ainda precisam ser substituídos pela nova API. Definir esta opção como false não corrigirá isso.
Talvez precisemos atualizar todos os métodos obsoletos e remover as opções useFindAndModify
na próxima versão principal?
Observação:
Apenas o MongoDB 3.2+ oferece suporte à consulta da série findOneAndUpdate, mas a biblioteca [email protected]
subjacente ainda usa o polyfill findAndModify para manter a compatibilidade de volta para 2.6 , portanto, tornar useFindAndModify
padrão para false não descartará o suporte para o MongoDB 3.0 atualmente.
No entanto, essa compatibilidade definitivamente será interrompida em breve, pois eles foram marcados como obsoletos desde [email protected]
(muito tempo atrás) e agora até lançam mensagens de aviso.
Portanto, sugiro que a próxima versão principal do mongoose (6.x) deprecie o suporte ao MongoDB 3.0 e adote todas as novas APIs. Além disso, o MongoDB 3.0 chegou ao fim da vida útil em fevereiro de 2018, meio ano atrás.
Alguma ideia?
Então... por que isso está acontecendo? É necessário esperar até o próximo grande lançamento do mangusto?
@lpiVasquez é porque o documento diz que o mongoose 5.x suporta MongoDB Server 3.0 .
Por enquanto, é seguro usar apenas a nova API porque a API subjacente ainda lida com isso para nós. No entanto, não funcionará quando a biblioteca subjacente alterar esse comportamento e precisamos ter muito cuidado ao atualizar a biblioteca subjacente.
O que quero dizer não é ignorar o problema, mas descartar o suporte ao MongoDB Server 3.0 na próxima versão 5.3. Pelo menos não quebre em 5.2. Mas apenas minha opinião.
@IpiVasquez
se por,
Por que isso está acontecendo?
você quer dizer,
por que o mongodb está descontinuando essas APIs
O Mongodb tem um plano para tornar as várias APIs de driver mais consistentes. Isso está documentado aqui na especificação do mongodb crud
É necessário esperar até o próximo grande lançamento do mangusto?
Se nos atermos à especificação semver , qualquer coisa que quebre a API deve acontecer em uma versão MAJOR , como @6.0.0
, em oposição a uma versão menor como @5.3.0
ou uma versão de patch como @5.2.10
.
Olhando para o histórico do driver nativo, eu não esperaria que eles removessem esses métodos até a v4 do driver.
Enquanto isso, acho que a maioria dos avisos de descontinuação que vi até agora podem ser atenuados na área de usuário não chamando métodos obsoletos. Eu estou supondo que a maioria desses métodos será removida no mangusto @6.0.0
qualquer maneira.
Eu acho que os 2 principais problemas para nós lidarmos no mangusto mais cedo ou mais tarde estão substituindo projections
por fields
nas opções de consulta (funciona de volta para pelo menos a versão do servidor 3.0.15) e potencialmente mudando o valor padrão de useFindAndModify
conforme descrito por @Fonger , com um adendo:
findOneAndUpdate no driver nativo chamará findAndModify para você internamente (sem o aviso de descontinuação) quando você estiver conectado a um servidor pré 3.2, então findOneAndUpdate
no mongoose ainda funciona com mongodb pré 3.2 e useFindAndModify: false
como demonstrado neste exemplo:
#!/usr/bin/env node
'use strict';
const mongoose = require('mongoose');
mongoose.set('useFindAndModify', false);
const url = 'mongodb://localhost:27017/test';
const opts = { useNewUrlParser: true };
mongoose.connect(url, opts);
const conn = mongoose.connection;
const Schema = mongoose.Schema;
const schema = new Schema({
name: String
});
const Test = mongoose.model('test', schema);
async function run() {
await conn.dropDatabase();
let admin = conn.db.admin();
let { version } = await admin.serverInfo();
console.log(`mongodb: ${version}`);
console.log(`mongoose: ${mongoose.version}`);
let cond = {};
let update = { name: 'Sarah' };
let opts = {
upsert: true,
new: true
};
let sarah = await Test.findOneAndUpdate(cond, update, opts);
console.log(sarah);
return conn.close();
}
run();
issues: ./6880.js
mongodb: 3.0.15
mongoose: 5.2.9
{ _id: 5b779ca8d1326ce227b6869f, __v: 0, name: 'Sarah' }
issues:
Você também pode demonstrar isso apenas com o driver nativo assim:
#!/usr/bin/env node
'use strict';
const { MongoClient, Logger } = require('mongodb');
const uri = 'mongodb://localhost:27017/test';
const opts = {
useNewUrlParser: true
};
async function run() {
const client = new MongoClient(uri, opts);
await client.connect();
const db = client.db('gh-6881');
await db.dropDatabase().catch(handleError);
Logger.setLevel('debug');
let res = await db
.collection('tests')
.findOneAndUpdate({}, { $set: { name: 'michael' } }, { upsert: true })
.catch(handleError);
Logger.setLevel('error');
console.log(res);
let doc = await db
.collection('tests')
.findOne({})
.catch(handleError);
console.log(doc);
process.exit(0);
}
run();
function handleError(e) {
return console.error(e.message);
}
...
message: 'executing command [{"ns":"gh-6881.$cmd","cmd":{"findAndModify":"tests","query":{},"new":false,"remove":false,"upsert":true,"update":{"$set":{"name":"michael"}}},"options":{}}] against localhost:27017',
...
{ value: null,
lastErrorObject:
{ updatedExisting: false,
n: 1,
upserted: 5b77a23cd1326ce227b686a1 },
ok: 1 }
{ _id: 5b77a23cd1326ce227b686a1, name: 'michael' }
Mesmo aqui. Eu recebi este aviso no início do aplicativo:
(node:9856) DeprecationWarning: collection.findAndModify is deprecated. Use findOneAndUpdate, findOneAndReplace or findOneAndDelete instead.
(node:9856) DeprecationWarning: collection.find option [fields] is deprecated and will be removed in a later version.
(node:9856) DeprecationWarning: collection.find option [fields] is deprecated and will be removed in a later version.
Se você achar o aviso de depreciação irritante, como uma solução _temporary_ , você pode iniciar o processo node.js no cli com --no-deprecation
para suprimir o aviso. É _não recomendado_ fazê-lo embora.
com o meu:
(node:1) DeprecationWarning: collection.findAndModify is deprecated. Use findOneAndUpdate, findOneAndReplace or findOneAndDelete instead.
(node:1) DeprecationWarning: collection.remove is deprecated. Use deleteOne, deleteMany, or bulkWrite instead.
(node:1) DeprecationWarning: collection.update is deprecated. Use updateOne, updateMany, or bulkWrite instead.
(node:1) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.
(node:1) DeprecationWarning: collection.find option [fields] is deprecated and will be removed in a later version.
(node:1) DeprecationWarning: collection.find option [fields] is deprecated and will be removed in a later version.
amo o package-lock.json mais do que nunca...
Existem várias soluções alternativas para contornar esses avisos de descontinuação:
1) Re: findOneAndUpdate()
e findAndModify()
depreciação, use mongoose.set('useFindAndModify', false);
2) Re: remove()
obsoleta, mude para usar deleteOne()
ou deleteMany()
dependendo se você deseja excluir apenas um documento
3) Re: update()
depreciação, substitua por updateMany()
Adicionaremos alguns documentos para ajudar as pessoas a limpar esses avisos de descontinuação e fazer algumas alterações internas para que o mangusto não cause um desses avisos de descontinuação.
Talvez precisemos atualizar todos os métodos obsoletos e remover as opções useFindAndModify na próxima versão principal?
Eu seria a favor disso 👍
O mangusto já tem suporte para os novos métodos, deleteOne()
, deleteMany()
, updateMany()
etc?
+1
mesmo aviso. precisamos esperar por um novo driver.
então, agora temos que ignorar esses avisos? quero dizer, eu estou tentando criar api, onde eu preciso obter tudo do db e sempre que eu chamo collection.find().then()....etc ele me dá o mesmo aviso. o que posso fazer para substituir esse método find()?
Se você está apenas incomodado com os avisos, provavelmente pode desabilitar os avisos de depreciação no Node (consulte o comentário de Fonger acima) ou pode reverter para uma versão mais antiga do Mongoose.
Então o que eu preciso fazer?
Recebi esta mensagem de aviso do mangusto toda vez que executo uma consulta de localização. Vou ignorá-lo até depois da próxima atualização da equipe do mangusto.
(node:15500) DeprecationWarning: a opção collection.find [campos] está obsoleta e será removida em uma versão posterior.
A correção para o aviso de depreciação fields
estará na versão 5.2.10, você não a verá mais. Para limpar os outros avisos de descontinuação, siga as instruções neste comentário: https://github.com/Automattic/mongoose/issues/6922#issue -354147871
Obrigado por escrever este documento https://mongoosejs.com/docs/deprecations.html
Re: findOneAndUpdate()
e findAndModify()
depreciação, a única solução alternativa atual ( 5.2.17
) é definir:
mongoose.set('useFindAndModify', false);
isso é verdade?
Estou usando Model.findByIdAndUpdate()
e Model.findOneAndUpdate()
Suponho que as funções subjacentes do driver mongo db usadas pelo mongoose serão / devem ser atualizadas em algum momento.
Estaria eu certo?
+1 Estou tendo o mesmo aviso de depreciação para usar Model.findByIdAndUpdate();
Estou usando as seguintes versões:
Alguma novidade sobre isso ?
@gianpaj sim mongoose.set('useFindAndModify', false)
é a única solução atual para o aviso de depreciação findAndModify. Meu palpite é que a chamada subjacente para collection.findAndModify()
desaparecerá em [email protected]. @vkarpov15 isso soa certo? ou é muito cedo para se comprometer com um prazo?
@daniyalawan confira os documentos aqui a opção 'useFindAndModify' se aplica a você se você chamar findOneAndUpdate
em seu código (isso se estende a findByIdAndUpdate porque chama findOneAndUpdate internamente).
@Sastidar quais problemas você está tendo após atualizar para o [email protected]? Todos os avisos de suspensão de uso devem ser abordados nestes documentos
@lineus @gianpaj sim, a necessidade da opção useFindAndModify desaparecerá com o Mongoose 6.0.0. Não há prazo para quando lançaremos o Mongoose 6.
Em relação ao aviso de depreciação - o mangusto eliminará gradualmente a capacidade de usar o método findByIdAndUpdate
ou o findAndModify
subjacente será eliminado sem matar minha implementação?
Estou basicamente perguntando se altero todos os meus findByIdAndUpdate
para findOneAndUpdate
antes de ter uma base de código maior.
@gianpaj sim
mongoose.set('useFindAndModify', false)
é a única solução alternativa atual para o aviso de depreciação findAndModify. Meu palpite é que a chamada subjacente paracollection.findAndModify()
desaparecerá em [email protected]. @vkarpov15 isso soa certo? ou é muito cedo para se comprometer com um prazo?@daniyalawan confira os documentos aqui a opção 'useFindAndModify' se aplica a você se você chamar
findOneAndUpdate
em seu código (isso se estende a findByIdAndUpdate porque chama findOneAndUpdate internamente).@Sastidar quais problemas você está tendo após atualizar para o [email protected]? Todos os avisos de suspensão de uso devem ser abordados nestes documentos
{new: true}
não funcionará se eu usar mongoose.set('useFindAndModify', false)
. alguma outra opção?
@anks333 o exemplo a seguir funciona para mim. Você pode modificá-lo para mostrar que { new: true }
não está funcionando?
#!/usr/bin/env node
'use strict';
const assert = require('assert');
const mongoose = require('mongoose');
mongoose.set('useFindAndModify', false);
const { Schema, connection} = mongoose;
const DB = '6880';
const URI = `mongodb://localhost:27017/${DB}`;
const OPTS = { family: 4, useNewUrlParser: true };
const schema = new Schema({
name: String
});
const Test = mongoose.model('test', schema);
const test = new Test({ name: 'test1' });
async function run() {
await mongoose.connect(URI, OPTS);
await connection.dropDatabase();
const doc = await Test.create(test);
assert.ok(doc);
const cond = {};
const update = { name: 'test2' };
const options = { new: true };
const updated = await Test.findOneAndUpdate(cond, update, options);
assert.strictEqual(updated.name, 'test2');
console.log('All Assertions Pass.');
await connection.close();
}
run();
issues: ./6880.js
All Assertions Pass.
issues:
@LBWright , não temos intenção de abandonar o suporte para findByIdAndUpdate, apenas trocaremos o findAndModify subjacente sem quebrar a API
(nó:10767) DeprecationWarning: collection.ensureIndex está obsoleto. Em vez disso, use createIndexes.
@jonaspereirar https://mongoosejs.com/docs/deprecations.html
Comentários muito úteis
Mesmo aqui. Também recebo "a opção de localizar [campos] está obsoleta e será removida em uma versão posterior".