Using map/reduce for mapping the properties in a collection
Posted
by And
on Stack Overflow
See other posts from Stack Overflow
or by And
Published on 2010-06-08T11:55:09Z
Indexed on
2010/06/08
14:52 UTC
Read the original article
Hit count: 330
Update: follow-up to MongoDB Get names of all keys in collection.
As pointed out by Kristina, one can use Mongodb 's map/reduce to list the keys in a collection:
db.things.insert( { type : ['dog', 'cat'] } );
db.things.insert( { egg : ['cat'] } );
db.things.insert( { type : [] });
db.things.insert( { hello : [] } );
mr = db.runCommand({"mapreduce" : "things",
"map" : function() {
for (var key in this) { emit(key, null); }
},
"reduce" : function(key, stuff) {
return null;
}})
db[mr.result].distinct("_id")
//output: [ "_id", "egg", "hello", "type" ]
As long as we want to get only the keys located at the first level of depth, this works fine. However, it will fail retrieving those keys that are located at deeper levels. If we add a new record:
db.things.insert({foo: {bar: {baaar: true}}})
And we run again the map-reduce +distinct snippet above, we will get:
[ "_id", "egg", "foo", "hello", "type" ]
But we will not get the bar and the baaar keys, which are nested down in the data structure. The question is: how do I retrieve all keys, no matter their level of depth? Ideally, I would actually like the script to walk down to all level of depth, producing an output such as:
["_id","egg","foo","foo.bar","foo.bar.baaar","hello","type"]
Thank you in advance!
© Stack Overflow or respective owner