Tengo una colección en MongoDB que representa las tareas que los niños deben hacer cada día y si las han terminado. Aquí hay un ejemplo de un documento.
{ "_id":"2022-02-13:joe", "kidName":"Joe", "chores": [ {"chore":"Breakfast: clear dishes and utensils","done":true}, {"chore":"Clearing dishes after meals","done":true}, {"chore":"Put away coats, knapsack, and shoes","done":true}, {"chore":"Clear toys","done":true} ], "date": 2022-02-13T00:00:00.000+00:00 } Quiero cambiarlo para que, en lugar de un valor booleano, done sea un número entero, donde:
| Significado | valor |
|---|---|
| Hecho | 1 |
| no hecho | -1 |
| No notificado | 0 |
¿Hay algún canal o truco en Compass para hacer esto con todos los documentos de la colección?
Puede usar el método de actualización con canalización de agregación para actualizar la matriz de tareas. Necesitaría usar la siguiente canalización para lograr los resultados deseados:
db.collection.updateMany( { 'chores.0': { '$exists': true } }, [ { '$set': { 'chores': { '$map': { 'input': '$chores', 'as': 'chore', 'in': { '$mergeObjects': [ '$$chore', { 'done': { '$switch': { 'branches': [ { 'case': { $eq: [ '$$chore.done', true ] }, then: 1 }, { 'case': { $eq: [ { $ifNull: ['$$chore.done', 'Unmarked'] }, 'Unmarked' ] }, then: 0 }, { 'case': { $eq: [ '$$chore.done', false ] }, then: -1 }, ], default: 0 } } } ] } } } } } ] )