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 canalización de agregación para las actualizaciones no es compatible en Mongo 4.0.

Aquí tienes un ejemplo de mis datos:

{
    "_id" : ObjectId("6144f74c066fee820d28b34f"),
    "Login" : ISODate("2021-09-16T21:09:00.000Z"),
    "DiaryNotes" : [ 
        {
            "Message" : "Metus tincidunt ultricies.",
            "Timestamp" : ISODate("1922-07-29T01:42:00.000Z")
        }, 
        {
            "Message" : "Ligula, eleifend ultrices, fames in, est aliquam ex congue.",
            "Timestamp" : ISODate("2022-01-09T12:48:00.000Z")
        }
    ]
}

La siguiente consulta funciona para Mongo 4.2+:

db.getCollection('Surveys').updateMany({}, [
  {
    $set: {
      DiaryNotes: {
        $filter: {
          input: "$DiaryNotes",
          cond: { $lt: [ "$Login", "$$this.Timestamp" ] }
        }
      }
    }
  }
])

Pero si esta consulta se ejecuta en un servicio de CosmosDB utilizando la API de Mongo 4.0, se produce un error: “Se esperaba un tipo de objeto pero se encontró un arreglo”. Creo que esto se debe a que Mongo 4.0 no admite tuberías de agregación para la actualización de documentos.

¿Se puede refactorizar esta consulta de manera que sea compatible con Mongo 4.0?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como Mongo 4.0 no admite actualizaciones en las canalizaciones de agregación, podemos reescribir la consulta para que funcione con Mongo 4.0 utilizando la sintaxis clásica de actualización. Aquí hay una forma de hacerlo:

    db.Surveys.updateMany(
      {},
      {
        $set: {
          DiaryNotes: {
            $filter: {
              input: "$DiaryNotes",
              as: "note",
              cond: { $lt: [ "$Login", "$$note.Timestamp" ] }
            }
          }
        }
      }
    )
    

    En esta versión de la consulta, estamos utilizando la sintaxis clásica de actualización con el operador $set para actualizar el campo DiaryNotes. También estamos utilizando el operador $filter para filtrar los elementos en la matriz DiaryNotes. La principal diferencia aquí es que estamos utilizando una variable “as” para hacer referencia a cada elemento en la matriz mientras evaluamos la condición del filtro.

    En general, esta consulta actualizada debería funcionar para Mongo 4.0 y proporcionar el mismo resultado que la consulta original para Mongo 4.2+.

Comments are closed.