tengo este esquema
{ _id: "123456", id: "123", inventory: [ { id: "foo", count: 0 }, { id: "bar", count: 3 } ] }Quería que todas las claves de "recuento" en la matriz de inventario fueran "precio", que se verá así al final:
{ _id: "123456", id: "123", inventory: [ { id: "foo", price: 0 }, { id: "bar", price: 3 } ] }Y he probado esto
Model.updateOne({ id: "123" }, { $unset: { inventory: [{ count: 1 }] } } )Pero parece estar eliminando el campo "inventario" en sí
Lo primero aquí es tratar de usar $rename pero cómo explican los documentos:
$renameno funciona si estos campos están en elementos de matriz.
Entonces es necesario buscar otro método. Entonces puede usar esta actualización con una consulta de agregación:
Esta consulta usa principalmente $map , $arrayToObject y $objectToArray . El truco aquí es:
inventory (sobrescriba uno existente)$map , y luego para cada objeto en la matriz use $objectToArray para crear una matriz y también itere sobre esa segunda matriz usando nuevamente $map .k y v . El campo v será el mismo (no desea cambiar el valor, solo la clave). Y para el campo k , debe cambiar solo el que coincida con su condición, es decir, solo cambie de count a price . Si no se cumple esta condición, la clave permanecerá. db.collection.update({}, [ { $set: { inventory: { $map: { input: "$inventory", in: { $arrayToObject: { $map: { input: {$objectToArray: "$$this"}, in: { k: { $cond: [ { $eq: ["$$this.k","count"] }, "price", "$$this.k" ] }, v: "$$this.v" } } } } } } } } ])Ejemplo aquí