Digamos que está creando una aplicación de tareas sencillas y tiene una estructura que se ve así:
{ [userId]: { nextTaskId:3, tasks: { 1: "take out the trash", 2: "pick up milk" } }Al agregar una tarea, me gustaría crear un nuevo registro usando el nextTaskId y también incrementarlo. He visto otros ejemplos que usan una función de agregación como $concat o similar, pero eso no se ajusta a mi caso de uso.
Me gustaría poder hacer referencia al campo en mi actualización, algo así como:
db.tasks.updateOne({_id:5}, {$inc:{nextId:1}, $set: {"tasks.$nextId":{"new task" }}})
el campo se incrementa, sin embargo, la clave de tareas no es 3, sino $nextId y también intenté usarlo como un valor, como en:
db.tasks.updateOne({_id:5}, {$inc:{nextId:1}, $set: {"tasks.3":{"$nextId" }}})
eso tampoco funciona. por supuesto, podría hacer esto haciendo 2 operaciones individuales, una para obtener la siguiente identificación e incrementarla, y otra para crear el nuevo registro de tareas, pero espero hacerlo con una sola operación.
¿Algunas ideas?
Puede usar la canalización de actualización con agregación para lograr el comportamiento en una sola declaración de actualización. Use $objectToArray y $arrayToObject para manipular la matriz de tasks .
db.collection.update({ _id: 5 }, [ { "$addFields": { "tasks": { "$objectToArray": "$tasks" } } }, { "$addFields": { "nextTaskId": { $add: [ "$nextTaskId", 1 ] }, tasks: { "$concatArrays": [ "$tasks", [ { k: { $toString: "$nextTaskId" }, // your input for the new task v: "next task" } ] ] } } }, { "$addFields": { "tasks": { "$arrayToObject": "$tasks" } } } ])Aquí está el parque infantil de Mongo para su referencia.