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:
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?
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