Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

254
Vistas
¿Cuál es el método correcto para actualizar un documento mientras se usa Mongo Cursor?

Estoy tratando de actualizar un documento en Mongo DB usando el cursor. La versión de mi controlador Mongo DB Java es 3.3.0. El siguiente es mi fragmento de código.

 MongoCollection<Document> collection = mongoDb.getCollection("customer"); MongoCursor<Document> cursor = collection.find().iterator(); try{ while(cursor.hasNext()){ Document oldDoc = cursor.next(); //created new Document newDoc collection.replaceOne(oldDoc, newDoc); } }catch(Exception e){ e.printStackTrace(); }

Aunque de esta manera, puedo actualizar el documento, creo que esta no es la forma eficiente porque aquí la colección se busca 2 veces. Quiero actualizar el documento anterior con algunos valores y luego guardarlo usando algunos métodos como collection.update(oldDoc) o collection.save(oldDoc) sin crear un nuevo documento. Busqué y me encontré con el siguiente post.

Java, MongoDB: ¿Cómo actualizar cada objeto mientras se itera una gran colección?

Esto es exactamente lo que quiero, pero no encuentro el método save() en la nueva API. Así que tengo 3 preguntas aquí.

  1. ¿Cuál es el equivalente del método save () en Mongo DB Java driver 3.3.0 API a través del cual puedo actualizar o guardar un documento mientras itero un cursor?
  2. ¿Hay alguna forma de actualizar el documento existente sin crear un nuevo documento en Mongo DB Java driver 3.3.0 API?
  3. El enlace anterior muestra que save() era parte de la API del controlador Mongo DB Java anteriormente. Cualquier respuesta experta, ¿por qué se eliminó de la API?
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

No se preocupe por la búsqueda adicional, el primer parámetro del método replaceOne es un filtro. Usar el documento antiguo como filtro usará la propiedad _id del documento, que debería ser relativamente rápido. Entonces, básicamente, la forma en que lo haces es correcta. Pero tenga en cuenta que la operación no es transaccional, lo que significa que la actualización puede afectar el conjunto de resultados del cursor. Por lo tanto, podría suceder que el documento actualizado se almacene en una posición por la que el cursor aún no ha pasado, lo que provocará que el documento se procese dos veces.

Con respecto a tus preguntas.

  1. La semántica del método save en mongo shell es actualizar o insertar el documento si aún no existe (también conocido como upsert). Lo más parecido a eso en MongoCollection es updateOne() con un UpdateOptions de upsert establecido en verdadero. Eso es básicamente lo que hace el comando save . Pero replaceOne conduce al mismo resultado, si el documento de reemplazo es una versión modificada del original.

  2. ¿Por qué preocuparse por la creación de objetos? En java, casi no tiene costo y no se preocupe por el consumo de memoria o GC, ya que esos objetos de corta duración se procesan en GC bastante rápido. Si desea tener un código más conciso, puede crear un objeto de filtro dedicado con solo el _id del oldDoc, modificar el oldDoc y usarlo en lugar del nuevo Doc.

Por ejemplo:

 UpdateOptions upsert = new UpdateOptions().upsert(true); Bson idFilter = Filters.eq("_id", oldDoc.getObjectId("_id")); //modify the oldDoc oldDoc. ... collection.replaceOne(idFilter, oldDoc, upsert);
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda