Get names of all keys in the collection Get names of all keys in the collection mongodb mongodb

Get names of all keys in the collection


You could do this with 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"})

Then run distinct on the resulting collection so as to find all the keys:

db[mr.result].distinct("_id")["foo", "bar", "baz", "_id", ...]


With Kristina's answer as inspiration, I created an open source tool called Variety which does exactly this: https://github.com/variety/variety


You can use aggregation with the new $objectToArray aggregation operator in version 3.4.4 to convert all top key-value pairs into document arrays, followed by $unwind and $group with $addToSet to get distinct keys across the entire collection. (Use $$ROOT for referencing the top level document.)

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

You can use the following query for getting keys in a single document.

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