获取所有唯一键和值

时间:2016-10-29 08:22:47

标签: python mongodb pymongo

我在mongodb有几个收藏。 mongodb中存在的数据结构示例如下:

{
    u'_id': ObjectId('581453c6aeddbf0f04fa017b'), 
    u'pdpData': {u'taxEntry': {u'taxPercentage': 5}, u'fashionType': u'Core'}
},
{
    u'_id': ObjectId('581453c7aeddbf0f04fa017c'), 
    u'pdpData': {u'taxEntry': {u'taxPercentage': 5}, u'fashionType': u'Fashion'},
    u'catalogAddDate': 1467297611
}

我希望以csv格式组合所有键和值。 结果的例子如下:

objectID,                  pdpdata.taxEntry.taxPercentage,   pdpdat.taxEntry.fashionType,   pdpdata.catalogAddDate
581453c6aeddbf0f04fa017b,  5,                                core,                          NA
581453c7aeddbf0f04fa017c,  5,                                Fashion,                       1467297611

我尝试了几种方法,但遗憾的是我无法获得所需格式的列名

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

distinctThingFields = db.women.map_reduce(mapper, reducer, out ={'inline' : 1}, full_response = True)
print distinctThingFields

这里我只将列值作为

objectID , pdpdata

不是内键

1 个答案:

答案 0 :(得分:1)

  

mongodb中的几个集合。 mongodb中存在的数据结构示例如下

假设您指的是多个文档而不是多个集合,则可以使用MongoDB Aggregation Pipeline

使用PyMongo,根据您的数据示例,您可以按objectIdtaxPercentagefashionType进行分组,如下所示:

pipeline = [
    {'$group':
       {'_id':
         {'objectId':"$_id",
          'taxPercentage':"$pdpData.taxEntry.taxPercentage",
          'fashionType':"$pdpData.fashionType"
         }
       }
     }]
cursor = db.collection.aggregate(pipeline)

迭代光标应该返回:

{u'_id': {u'taxPercentage': 5.0, u'objectId': ObjectId('...'), u'fashionType': u'Fashion'}}
{u'_id': {u'taxPercentage': 5.0, u'objectId': ObjectId('...'), u'fashionType': u'Core'}}

然后,您可以使用Python csv module导出为CSV。

如果这些文档跨越多个集合,并且:

a)文档具有相同的数据结构:通常,您应该在同一个集合中具有相同的结构化文档。有关详细信息,另请参阅Data Modeling

b)文档具有不同的数据结构:您可以对每个集合运行聚合,然后在Python脚本(客户端)中聚合结果。如果这是一个经常使用的查询/报告,您应该重新考虑您的数据结构。