Mongoose: Métodos de coleta obsoletos do mongodb

Criado em 17 ago. 2018  ·  28Comentários  ·  Fonte: Automattic/mongoose

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

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".

Todos 28 comentários

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

Aviso: Não defina esta opção como false na produção sem o teste adequado

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:

6880.js

#!/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();

Saída:

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:

6880_native.js

#!/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);
}

Saída truncada:

...
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:

  • mongodb: 3.1.4
  • mangusto: 5.2.16

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

{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?

6880.js

#!/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();

Saída:

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.

Esta página foi útil?
0 / 5 - 0 avaliações