Obtener los nombres de todas las claves de la colección.

Resuelto Steve asked hace 14 años • 25 respuestas

Me gustaría obtener los nombres de todas las claves de una colección de MongoDB.

Por ejemplo, de esto:

db.things.insert( { type : ['dog', 'cat'] } );
db.things.insert( { egg : ['cat'] } );
db.things.insert( { type : [] } );
db.things.insert( { hello : []  } );

Me gustaría obtener las claves únicas:

type, egg, hello
Steve avatar Feb 20 '10 02:02 Steve
Aceptado

Podrías hacer esto con MapReduce:

mr = db.runCommand({
  "mapreduce" : "my_collection",
  "map" : function() {
    for (var key in this) { emit(key, null); }
  },
  "reduce" : function(key, stuff) { return null; }, 
  "out": "my_collection" + "_keys"
})

Luego ejecute distinto en la colección resultante para encontrar todas las claves:

db[mr.result].distinct("_id")
["foo", "bar", "baz", "_id", ...]
kris avatar Feb 22 '2010 00:02 kris

Con la respuesta de Kristina como inspiración, creé una herramienta de código abierto llamada Variety que hace exactamente esto: https://github.com/variety/variety

James Cropcho avatar Apr 28 '2012 17:04 James Cropcho

Puede usar la agregación con el nuevo $objectToArrayoperador de agregación en la versión 3.4.4 para convertir todos los pares clave-valor principales en matrices de documentos, seguido de $unwindy $groupcon $addToSetpara obtener claves distintas en toda la colección. (Úselo $$ROOTpara hacer referencia al documento de nivel superior).

db.things.aggregate([
  {"$project":{"arrayofkeyvalue":{"$objectToArray":"$$ROOT"}}},
  {"$unwind":"$arrayofkeyvalue"},
  {"$group":{"_id":null,"allkeys":{"$addToSet":"$arrayofkeyvalue.k"}}}
])

Puede utilizar la siguiente consulta para obtener claves en un solo documento.

db.things.aggregate([
  {"$match":{_id: "<<ID>>"}}, /* Replace with the document's ID */
  {"$project":{"arrayofkeyvalue":{"$objectToArray":"$$ROOT"}}},
  {"$project":{"keys":"$arrayofkeyvalue.k"}}
])
s7vr avatar Apr 23 '2017 11:04 s7vr