Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

369
Visualizações
No se puede usar el operador de agregación $add para actualizar las fechas al usar Array Filters (MongoDB)

A continuación se muestra un ejemplo de un documento en una colección de usuarios a continuación.

 { "_id" : 1, "username" : bob, "pause" : true, "pause_date" : ISODate("2021-07-16T07:13:48.680Z"), "learnt_item" : [ { "memorized" : false, "character" : "一", "next_review" : ISODate("2021-07-20T11:02:44.979Z") }, { "memorized" : false, "character" : "二", "next_review" : ISODate("2021-07-20T11:02:44.979Z") }, ... ] }

Necesito actualizar todo el documento anidado en "learnt_item" si el campo "memorizado" es falso.

Las actualizaciones son:

  1. "pause_date" a nulo
  2. "pausa" a Falso
  3. Actualice la fecha ISO en "next_review" en función de la duración que haya transcurrido entre "pause_date" y la hora actual. Por ejemplo, pause_date hace 4 horas, entonces quiero agregar 4 horas a "next_review"

Pude lograr 1 y 2 usando findOneAndUpdate con arrayFilters y también probé el número 3 actualizando el campo "next_review" con una fecha actual para asegurarme de que se actualice correctamente.

 User.findOneAndUpdate({"_id": req.user._id}, {$set:{"learnt_item.$[elem].next_review": DateTime.local(),"pause_date": null, "pause": value }}, {new:true, arrayFilters: [{"elem.memorized": false}]}).exec((err, doc) =>{if (err){res.send(err)} else {res.send(doc)}});

Estaba pensando en usar el operador de agregación $add para aumentar la base de datos

 "learnt_item.$[elem].next_review": {$add: ["$learnt_item.$[elem].next_review","$pause_date"]}

Sin embargo, según la documentación, arrayFilters no está disponible para las actualizaciones que usan una canalización de agregación.

¿Hay otra forma más eficiente de actualizar la fecha ISO?

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Si está ejecutando MongoDB 4.2 o posterior, puede usar una canalización como segundo parámetro para la función de actualización, de esta manera puede usar el operador $map con $cond para encontrar las entradas donde la propiedad memorized es igual a false y luego agregar 4 días en milisegundos hasta la next_review fecha de revisión:

 db.collection.update({ "_id": 1 }, [ { $set: { "pause_date": null, "pause": false, "learnt_item": { $map: { input: "$learnt_item", as: "item", in: { $cond: [ { $eq: [ "$$item.memorized", false ] }, { memorized: "$$item.memorized", character: "$$item.character", next_review: { $add: [ "$$item.next_review", 345600000 ] } }, "$$item" ] } } }, } } ], { new: true, });

Puede consultar un ejemplo en ejecución aquí: https://mongoplayground.net/p/oHh1JWiP8vs

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda