Tengo una colección en la base de datos de la que estoy tratando de recuperar algunos datos, la consulta funciona bien cuando $orderID tiene elementos de cadena, pero falla cuando $orderID tiene algunos números en la matriz, y está arrojando
query failed: (Location40395) PlanExecutor error during aggregation :: caused by :: $arrayToObject requires an array of key-value pairs, where the key must be of type string. Found key type: double Creo que debe haber algunos datos antiguos cuando orderID como un número, por eso está fallando en algún rango de fechas
Consulta
{ "Order_Details": { "$map": { "input": { "$objectToArray": { "$arrayToObject": { "$zip": { "inputs": [ "$orderID", "$total_value_of_order" ] } } } }, "as": "el", "in": { "orderID": "$$el.k", "total_value_of_order": "$$el.v" } } } } Estoy tratando de encasillar el.k en una cadena. Estoy usando $toString pero parece que no funciona, la forma en que lo intento es
{ "as": "el", "in": { "orderID": { "$toString": "$$el.k" }, "total_value_of_order": "$$el.v" } }colección de ejemplo
[ { "_id": ObjectId("5e529ee5f8647eb59e5620a2"), "visitID": "dVmy7flXFHzzkn9HiMt8IoWvthoTZW", "date": ISODate("2022-02-08T16:29:13.413Z"), "control": true, "orderID": [ 122343242 ], "target": "test", "total_value_of_order": [ 60 ] } ]Estás cerca, el enfoque está bien. solo tienes un par de problemas de sintaxis. Lo más importante que debe cambiar es la entrada para $arrayToObject , actualmente su entrada se ve así:
[[number, number], [number, number]] Sin embargo $arrayToObject espera una entrada en cierto formato:
[{k: string, v: value}]Entonces esto es lo que agregaremos, así:
db.collection.aggregate([ { $project: { "Order_Details": { "$map": { "input": { "$objectToArray": { "$arrayToObject": { $map: { input: { "$zip": { "inputs": [ "$orderID", "$total_value_of_order" ] } }, in: { k: { $toString: { "$arrayElemAt": [ "$$this", 0 ] } }, v: { "$arrayElemAt": [ "$$this", 1 ] } } } } } }, "as": "el", "in": { "orderID": "$$el.v", "total_value_of_order": "$$el.k" } } } } } ]) Observe que el formato "orderid" cambia a string , lo que afecta su estructura, recomiendo simplemente cambiar entre k y v en la canalización, así