当前位置:  开发笔记 > 编程语言 > 正文

获取集合中所有键的名称

如何解决《获取集合中所有键的名称》经验,为你挑选了9个好方法。

我想获取MongoDB集合中所有键的名称.

例如,从这个:

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

我想得到独特的钥匙:

type, egg, hello

kristina.. 323

您可以使用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"
})

然后在生成的集合上运行distinct,以便找到所有键:

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

这可能是显而易见的,但是如果你想得到一个子文档中所有唯一键的列表,只需修改这一行:`for(var key in this.first_level.second_level.nth_level){emit(key,null); }` (6认同)

我知道这是一个老线程,但我似乎有类似的需求.我正在使用nodejs mongodb本机驱动程序.由此产生的临时收集似乎总是空着.我正在集合类中使用mapreduce函数.这不可能吗? (3认同)

嗨,您好!我刚刚发布了一个关于这个问题的后续问题,询问如何使这个代码片段工作,即使是位于数据结构更深层次的密钥(http://stackoverflow.com/questions/2997004/using-map-reduce-for -mapping最性质-IN-A-集合). (2认同)


小智.. 196

以Kristina的答案为灵感,我创建了一个名为Variety的开源工具,它正是这样做的:https://github.com/variety/variety



1> kristina..:

您可以使用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"
})

然后在生成的集合上运行distinct,以便找到所有键:

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


这可能是显而易见的,但是如果你想得到一个子文档中所有唯一键的列表,只需修改这一行:`for(var key in this.first_level.second_level.nth_level){emit(key,null); }`
我知道这是一个老线程,但我似乎有类似的需求.我正在使用nodejs mongodb本机驱动程序.由此产生的临时收集似乎总是空着.我正在集合类中使用mapreduce函数.这不可能吗?
嗨,您好!我刚刚发布了一个关于这个问题的后续问题,询问如何使这个代码片段工作,即使是位于数据结构更深层次的密钥(http://stackoverflow.com/questions/2997004/using-map-reduce-for -mapping最性质-IN-A-集合).

2> 小智..:

以Kristina的答案为灵感,我创建了一个名为Variety的开源工具,它正是这样做的:https://github.com/variety/variety


祝贺,这是一个很棒的工具.它完全符合问题的要求,并且可以配置限制,深度等.任何跟随的人推荐.

3> user2683814..:

您可以使用聚集新$objectToArrray3.4.4版本所有顶级密钥值对转换成文件阵列,然后$unwind$group$addToSet得到跨越整个集合不同的键.

$$ROOT 用于引用顶级文档.

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

您可以使用以下查询来获取单个文档中的键.

db.things.aggregate([
  {"$project":{"arrayofkeyvalue":{"$objectToArray":"$$ROOT"}}},
  {"$project":{"keys":"$arrayofkeyvalue.k"}}
])


这真是最好的答案.在不涉及其他编程语言或包的情况下解决问题,并与支持聚合框架的所有驱动程序一起使用(甚至是Meteor!)

4> 小智..:

试试这个:

doc=db.thinks.findOne();
for (key in doc) print(key);


不正确的答案,因为这只输出集合中单个文档的字段 - 其他可能都有完全不同的键.
对我来说它仍然是最有用的答案,是一个简单的合理最小值.
它没用吗?如果它给你错误的答案,它是如何有用的?
这不是一个好的答案它是如何获得集合中****元素的键而不是集合中的所有**键的答案!
上下文显示了什么是有用的:如果数据被规范化(例如来自CSV文件的origen),它是有用的......对于从SQL导入的数据是有用的.
这将解决像`db.thinks.find().forEach(function(doc){for(key in doc)print(key);});

5> 小智..:

如果您的目标集合不是太大,您可以在mongo shell客户端下尝试:

var allKeys = {};

db.YOURCOLLECTION.find().forEach(function(doc){Object.keys(doc).forEach(function(key){allKeys[key]=1})});

allKeys;



6> Laizer..:

使用python.返回集合中所有顶级键的集合:

#Using pymongo and connection named 'db'

reduce(
    lambda all_keys, rec_keys: all_keys | set(rec_keys), 
    map(lambda d: d.keys(), db.things.find()), 
    set()
)



7> Ingo Fischer..:

使用pymongo清理并重用的解决方案:

from pymongo import MongoClient
from bson import Code

def get_keys(db, collection):
    client = MongoClient()
    db = client[db]
    map = Code("function() { for (var key in this) { emit(key, null); } }")
    reduce = Code("function(key, stuff) { return null; }")
    result = db[collection].map_reduce(map, reduce, "myresults")
    return result.distinct('_id')

用法:

get_keys('dbname', 'collection')
>> ['key1', 'key2', ... ]



8> BobHy..:

以下是在Python中使用的示例:此示例以内联方式返回结果.

from pymongo import MongoClient
from bson.code import Code

mapper = Code("""
    function() {
                  for (var key in this) { emit(key, null); }
               }
""")
reducer = Code("""
    function(key, stuff) { return null; }
""")

distinctThingFields = db.things.map_reduce(mapper, reducer
    , out = {'inline' : 1}
    , full_response = True)
## do something with distinctThingFields['results']



9> Ashh..:

如果您使用的是mongodb 3.4.4及更高版本,则可以使用$objectToArray$group聚合来使用以下聚合

db.collection.aggregate([
  { "$project": {
    "data": { "$objectToArray": "$$ROOT" }
  }},
  { "$project": { "data": "$data.k" }},
  { "$unwind": "$data" },
  { "$group": {
    "_id": null,
    "keys": { "$addToSet": "$data" }
  }}
])

这是工作示例

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有