更新: 对 MongoDB获取集合所有键名的方法 的后续跟进。
正如Kristina所指出的,可以使用Mongodb的map/reduce方法来列出集合中的键名:
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" ]
只要我们只想获得位于第一层深度的键,这个方法就可以正常工作。但是,它将无法检索位于更深层次的键。如果我们添加一个新记录:db.things.insert({foo: {bar: {baaar: true}}})
如果我们再次运行上面的 map-reduce + distinct 代码片段,我们将得到:
[ "_id", "egg", "foo", "hello", "type" ]
但是我们无法获取嵌套在数据结构中的bar和baaar键。问题是:我该如何检索所有键,无论它们的深度如何?理想情况下,我希望脚本可以遍历所有深度级别,生成如下输出:
["_id","egg","foo","foo.bar","foo.bar.baaar","hello","type"]
提前感谢您!
out
参数,这在当时并不存在。坦白地说,你可能不想使用M/R来完成这个任务,因为它可能可以使用更好的聚合框架来完成。 - Gates VP