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"}}])