es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La operación updateOne, $setOnInsert no está funcionando.

Antes de realizar la operación updateOne y setOnInsert,

> db.blog.posts.findOne()

< { 
   _id: ObjectId("6199f4a6e441680652333cbc"),
   content: '...',
   comments: [ 
      { comment: 'buen post', autor: 'Juan', votos: 0 }
     ] 
   }

<p>Después de realizar la operación <code>updateOne</code> y <code>setOnInsert</code>,
<br>

> db.blog.posts.updateOne({_id: ObjectId("6199f4a6e441680652333cbc")}, {"$setOnInsert" : {"createAt" : new Date()}}, {"upsert" : true})</p>

< { 
   acknowledged: true,
   insertedId: null,
   matchedCount: 1,
   modifiedCount: 0,
   upsertedCount: 0 
  }

<p>Imprimir el resultado.</p>

<p>“`shell

db.blog.posts.findOne()

< {
_id: ObjectId(“6199f4a6e441680652333cbc”),
content: ‘…’,
comments: [
{ comment: ‘buen post’, autor: ‘Juan’, votos: 0 }
]
}
“`

Nunca funciona… Leí muchos artículos pero no pude encontrar las razones por las cuales no funciona.
Por favor, ayúdeme maestros…..

Tags:  ,

Answer

  1. Avatar for davy.ai

    Basándonos en el código proporcionado, la operación “updateOne” con “setOnInsert” debería haber agregado un nuevo campo llamado “createdAt” con el valor de la fecha actual al documento si no existía ningún documento con el “_id” especificado. Sin embargo, la operación “findOne” después de la actualización no reflejó ese cambio.

    Una posible razón para esto es que la opción “upsert” no se configuró correctamente. En la llamada a “updateOne”, se proporcionó “{ “upsert”: true }” como tercer argumento, lo que debería haber causado que se insertara un nuevo documento con el valor de “setOnInsert” si no existía ningún documento con el “_id”. Sin embargo, el resultado de la actualización mostró que no se insertó ningún documento (“insertedId: null” y “upsertedCount: 0”), lo que sugiere que la opción “upsert” no se activó.

    Otra posible razón es que hay un error tipográfico o un valor incorrecto en el campo “_id” de la operación “findOne”, lo que hace que recupere un documento diferente al que se actualizó. Para confirmar esto, puede verificar si el valor de “_id” en la llamada “findOne” coincide con el valor de “_id” utilizado en la llamada “updateOne”.

    Para depurar más, puede intentar ejecutar cada operación por separado y verificar el resultado para ver dónde podría surgir el problema. Por ejemplo, puede intentar ejecutar la operación “findOne” por sí sola y verificar que devuelva el documento esperado. Luego, puede intentar ejecutar la operación “updateOne” sin la opción “setOnInsert” y ver si modifica el documento existente según lo esperado. Si esas operaciones funcionan correctamente, puede intentar agregar la opción “setOnInsert” de nuevo y ver si se aplica correctamente.

Comments are closed.