Mongoose: Métodos de recopilación en desuso de mongodb

Creado en 17 ago. 2018  ·  28Comentarios  ·  Fuente: Automattic/mongoose

¿Desea solicitar una característica o informar un error ?

Bicho

¿Cuál es el comportamiento actual?

Model.findByIdAndUpdate() está emitiendo una advertencia de obsolescencia para mongodb, que ha obsoleto collection.findAndModify. Mongodb sugiere usar findOneAndUpdate, findOneAndReplace o findOneAndDelete en su lugar.

collection.ensureIndex también está en desuso; mongodb sugiere usar createIndexes en su lugar.

Si el comportamiento actual es un error, proporcione los pasos para reproducirlo.

El uso de Model.findByIdAndUpdate/findOneAndUpdate para modificar un documento devuelve estas advertencias de obsolescencia.

¿Cuál es el comportamiento esperado?

¡Sin advertencias de desaprobación!

Mencione su versión de node.js, mongoose y MongoDB.

Nodo v10.8.0
mongodb v3.6.2
mangosta v5.2.9

Comentario más útil

Aquí igual. También obtengo "la opción de búsqueda [campos] está en desuso y se eliminará en una versión posterior".

Todos 28 comentarios

Aquí igual. También obtengo "la opción de búsqueda [campos] está en desuso y se eliminará en una versión 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.

Aquí hay algunos otros que tengo

Relacionado con #6165 y se puede reproducir en la prueba CI

Puede especificar useFindAndModify como falso para evitar un mensaje de desaprobación parcial. En mi opinión, esto debería ser falso ahora por defecto.

mongoose.set('useFindAndModify', false);

Advertencia: no establezca esta opción en falso en producción sin las pruebas adecuadas

Sin embargo, otros métodos obsoletos como ensureIndex(es) y update también deben reemplazarse con una nueva API. Establecer esta opción en falso no solucionará esto.
¿Tal vez necesitemos actualizar todos los métodos obsoletos y eliminar las opciones useFindAndModify en la próxima versión principal?

Nota:
Solo MongoDB 3.2+ es compatible con la consulta de la serie findOneAndUpdate, pero la biblioteca subyacente [email protected] aún usa findAndModify polyfill para mantener la compatibilidad con 2.6 , por lo que hacer que useFindAndModify sea ​​falso por defecto no eliminará la compatibilidad con MongoDB 3.0 actualmente.

Sin embargo, esta compatibilidad definitivamente se romperá pronto, ya que se han marcado como obsoletos desde [email protected] (hace mucho tiempo) y ahora incluso arrojan mensajes de advertencia.

Por lo tanto, sugiero que la próxima versión principal de mongoose (6.x) deje de admitir MongoDB 3.0 y adopte todas las API nuevas. Además, MongoDB 3.0 llegó al final de su vida útil en febrero de 2018, hace medio año.

¿Alguna idea?

Entonces... ¿por qué sucede esto? ¿Es necesario esperar hasta el próximo lanzamiento principal de mongoose?

@lpiVasquez es porque el documento dice que mongoose 5.x es compatible con MongoDB Server 3.0 .

Por ahora, es seguro usar solo la nueva API porque la API subyacente todavía maneja esto por nosotros. Sin embargo, no funcionará una vez que la biblioteca subyacente cambie este comportamiento y debemos tener mucho cuidado al actualizar la biblioteca subyacente.

Lo que quiero decir no es ignorar el problema, sino eliminar el soporte para MongoDB Server 3.0 en la próxima versión 5.3. Al menos no se rompa en 5.2. Aunque solo mi opinión.

@IpiVasquez

si por,

¿Por qué está pasando esto?

Quiere decir,

¿Por qué mongodb está desaprobando estas API?

Mongodb tiene un plan para hacer que las diversas API de controladores sean más consistentes. Esto está documentado aquí en la especificación de mongodb crud

¿Es necesario esperar hasta el próximo lanzamiento principal de mongoose?

Si nos ceñimos a las especificaciones de semver , cualquier cosa que rompa la API debería ocurrir en una versión PRINCIPAL , como @6.0.0 en lugar de una versión menor como @5.3.0 o una versión de parche como @5.2.10 .

Mirando hacia atrás en el historial del controlador nativo, no esperaría que eliminen estos métodos hasta la versión 4 del controlador.

Mientras tanto, creo que la mayoría de las advertencias de obsolescencia que he visto hasta ahora pueden mitigarse en la zona de usuarios al no llamar a los métodos obsoletos. Supongo que la mayoría de estos métodos se eliminarán en mongoose @6.0.0 todos modos.

Creo que los 2 problemas principales con los que debemos lidiar en mongoose más temprano que tarde son sustituir projections por fields en las opciones de consulta (funciona al menos a la versión del servidor 3.0.15) y potencialmente cambiar el valor predeterminado de useFindAndModify como lo describe @Fonger , con un apéndice:

findOneAndUpdate en el controlador nativo llamará a findAndModify internamente (sin la advertencia de obsolescencia) cuando esté conectado a un servidor anterior a 3.2, por lo que findOneAndUpdate en mongoose todavía funciona con mongodb anterior a 3.2 y useFindAndModify: false como se demuestra en este ejemplo:

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

Producción:

issues: ./6880.js
mongodb: 3.0.15
mongoose: 5.2.9
{ _id: 5b779ca8d1326ce227b6869f, __v: 0, name: 'Sarah' }
issues:

También puede demostrar esto solo con el controlador nativo de esta manera:

6880_nativo.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);
}

Salida 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' }

Aquí igual. Recibí esta advertencia al iniciar la aplicación:

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

Si encuentra molesta la advertencia de obsolescencia, como solución _temporal_ , puede iniciar el proceso node.js en cli con --no-deprecation para suprimir la advertencia. Sin embargo, no se recomienda hacerlo.

conmigo:

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

me encanta package-lock.json más que nunca...

Hay varias soluciones para sortear estas advertencias de obsolescencia:

1) Re: findOneAndUpdate() y findAndModify() obsolescencia, use mongoose.set('useFindAndModify', false);
2) Re: remove() obsolescencia, cambie a deleteOne() o deleteMany() dependiendo de si solo desea eliminar un documento
3) Re: update() obsolescencia, reemplazar con updateMany()

Agregaremos algunos documentos para ayudar a las personas a limpiar estas advertencias de obsolescencia y haremos algunos cambios internos para que Mongoose no cause una de estas advertencias de obsolescencia.

¿Tal vez necesitemos actualizar todos los métodos obsoletos y eliminar las opciones useFindAndModify en la próxima versión principal?

Yo estaría a favor de esto 👍

¿Mangoose ya tiene soporte para los nuevos métodos, deleteOne() , deleteMany() , updateMany() etc.?

+1
misma advertencia. tenemos que esperar a un nuevo controlador.

Entonces, ¿ahora mismo tenemos que ignorar esas advertencias? Quiero decir que estoy tratando de crear una API, donde necesito obtener todo de db y cada vez que llamo a collection.find().then()....etc me da la misma advertencia. ¿Qué puedo hacer para reemplazar ese método find ()?

Si solo le molestan las advertencias, probablemente pueda deshabilitar los avisos de desaprobación en Node (vea el comentario de Fonger arriba), o puede volver a una versión anterior de Mongoose.

Entonces, ¿qué necesito hacer?

Recibí este mensaje de advertencia de mangosta cada vez que ejecuto una consulta de búsqueda. Lo ignoraré hasta después de la próxima actualización del equipo de mangosta.

(nodo: 15500) Advertencia de desuso: la opción [fields] de collection.find está en desuso y se eliminará en una versión posterior.

La solución para la advertencia de obsolescencia de fields estará en 5.2.10, ya no la verá. Para limpiar las otras advertencias de obsolescencia, siga las instrucciones de este comentario: https://github.com/Automattic/mongoose/issues/6922#issue -354147871

Gracias por escribir este documento https://mongoosejs.com/docs/deprecations.html

Re: findOneAndUpdate() y findAndModify() desuso, la única solución actual ( 5.2.17 ) es configurar:

mongoose.set('useFindAndModify', false);

¿es eso cierto?

Estoy usando Model.findByIdAndUpdate() y Model.findOneAndUpdate()

Supongo que las funciones subyacentes del controlador mongo db que utiliza mongoose se actualizarán / deberían actualizarse en algún momento.
¿Estaría yo en lo cierto?

+1 Tengo la misma advertencia de desaprobación por usar Model.findByIdAndUpdate();

Estoy usando las siguientes versiones:

  • mongodb: 3.1.4
  • mangosta: 5.2.16

Alguna noticia sobre esto ?

@gianpaj mongoose.set('useFindAndModify', false) es la única solución actual para la advertencia de desuso de findAndModify. Supongo que la llamada subyacente a collection.findAndModify() desaparecerá en [email protected]. @ vkarpov15 ¿suena eso bien? ¿O es demasiado pronto para comprometerse con un marco de tiempo?

@daniyalawan consulte los documentos aquí , la opción 'useFindAndModify' se aplica a usted si llama a findOneAndUpdate en su código (esto se extiende a findByIdAndUpdate porque llama a findOneAndUpdate internamente).

@Sastidar , ¿qué problema(s) tiene después de actualizar a [email protected]? Todas las advertencias de obsolescencia deben abordarse en estos documentos

@lineus @gianpaj sí, la necesidad de la opción useFindAndModify desaparecerá con Mongoose 6.0.0. No hay plazo para el lanzamiento de Mongoose 6.

Con respecto a la advertencia de desaprobación: ¿Mangoose eliminará gradualmente la capacidad de usar el método findByIdAndUpdate o el findAndModify subyacente simplemente se eliminará sin eliminar mi implementación?

Básicamente estoy preguntando si cambio todos mis findByIdAndUpdate a findOneAndUpdate antes de tener una base de código más grande.

@gianpaj mongoose.set('useFindAndModify', false) es la única solución actual para la advertencia de desuso de findAndModify. Supongo que la llamada subyacente a collection.findAndModify() desaparecerá en [email protected]. @ vkarpov15 ¿suena eso bien? ¿O es demasiado pronto para comprometerse con un marco de tiempo?

@daniyalawan consulte los documentos aquí , la opción 'useFindAndModify' se aplica a usted si llama a findOneAndUpdate en su código (esto se extiende a findByIdAndUpdate porque llama a findOneAndUpdate internamente).

@Sastidar , ¿qué problema(s) tiene después de actualizar a [email protected]? Todas las advertencias de obsolescencia deben abordarse en estos documentos

{new: true} no funcionará si uso mongoose.set('useFindAndModify', false) . alguna otra opcion?

@ anks333 el siguiente ejemplo funciona para mí. ¿Puedes modificarlo para que muestre que { new: true } no funciona?

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

Producción:

issues: ./6880.js
All Assertions Pass.
issues:

@LBWright no tenemos intención de eliminar el soporte para findByIdAndUpdate, simplemente cambiaremos el findAndModify subyacente sin romper la API

(nodo: 10767) DeprecationWarning: collection.ensureIndex está en desuso. Utilice createIndexes en su lugar.

¿Fue útil esta página
0 / 5 - 0 calificaciones