Tengo una colección de users con la siguiente estructura:
[ { name: "xxx", labels: [ { category: "Language", values: ["English", "Spanish"], }, { category: "Hobby", values: ["Read", "Cook", "Read"], }, ] }, { name: "yyy", labels: [ { category: "Language", values: ["English", "English"], }, { category: "Hobby", values: ["Read", "Play", "Play"], }, ] }, ] Quiero eliminar todos los duplicados de la matriz de values , por lo que el resultado sería:
[ { name: "xxx", labels: [ { category: "Language", values: ["English", "Spanish"], }, { category: "Hobby", values: ["Read", "Cook"], }, ] }, { name: "yyy", labels: [ { category: "Language", values: ["English"], }, { category: "Hobby", values: ["Read", "Play"], }, ] }, ] Traté de usar setUnion y setIntersection , pero no sabía cuál es el motivo correcto para usarlos con una matriz anidada.
Para Mongo versión 4.2+, puede usar actualizaciones de canalización para esto, así:
db.collection.updateMany( {}, [ { "$set": { labels: { $map: { input: "$labels", in: { $mergeObjects: [ "$$this", { values: { $setUnion: "$$this.values" } } ] } } } } } ])Para versiones anteriores de Mongo, deberá leer cada documento en la memoria y hacerlo en código, luego actualizar cada documento por separado.