Tengo los siguientes datos en mi colección:
[ { _id: "2313123123", metadata: { path: "...", value: "...", name: "..." } }, { _id: "2313123123", metadata: { path: "...", name: "...", origin: "...", } }, { _id: "2313123123", metadata: { path: "...", source: "..." } }, ] Quiero recuperar todos los nombres clave distintos de los metadata de campo de mis documentos. Quiero recuperar ["path", "value", "name", "origin", "source"] .
¿Cómo puedo consultar esto? ¿Es esto posible con el método distinct o necesito usar aggregate ?
Tendrá que usar un agregado para esto, lamentablemente debido a la naturaleza de sus necesidades, esta será una canalización muy "costosa" de ejecutar. No hay forma de evitar iterar sobre toda la colección y agregar las claves únicas a la matriz.
Vamos a usar $objectToArray para convertir metadata en una matriz, luego $unwind y finalmente usando $group podemos guardar todos los valores únicos.
db.collection.aggregate([ { $project: { keys: { $map: { input: { "$objectToArray": "$metadata" }, in: "$$this.k" } } } }, { $unwind: "$keys" }, { $group: { _id: null, keys: { "$addToSet": "$keys" } } } ])db.collection.aggregate([ { $addFields: { metadata: { $objectToArray: "$metadata" } } }, { $unwind: "$metadata" }, { $group: { _id: "distinct", dist: { $addToSet: "$metadata.k" } } } ])explicado:
Útil javascript en línea de la opción mongo shell:
db.collection.find({},{metadata:1,_id:0}).forEach( function(doc) { for (key in doc.metadata) s.push(key); } );uni = Array.from(new Set(s));printjson(uni); ["path","name","origin","source","value"]