如何使用monary从集合中选择所有字段/列?

时间:2018-04-23 05:59:00

标签: mongodb monary

我正在使用Monary

我在Mongo有一个包含大量行和列的数据库。目前,我使用monary的方式如下:

client = Monary()
data = client.query("static_database",             # Database name
                     "properties",                 # Collection name 
                      {},                          # Query
                     ["Name","Address1","Address2"], # Field/col names
                     ["string:72"]*3)              # The types of each 
                                                   # field/col

集合properties有很多字段名称,我想将大部分(如果不是全部)字段带入data。在列表中输入10个以上的字段似乎很痛苦。

我还希望将来使用不同的集合,因此获取所有列/字段名称的方法将有很大帮助。我仔细阅读了文档和FAQs,但未能找到解决方案。

1 个答案:

答案 0 :(得分:0)

我最终使用pyMongo获取所有相应的列名,使用this answer和mapReduce documentation提供的代码。

下一个问题是type。尝试找到每个字段的类型非常烦人(每个字段可以包含多种类型的项目)。我看了this question。但它看起来像是一团糟,所以我最终只拿了random entry from mongodb希望包含所有字段。

应该有更好的获取类型名称的方法,但我没有实现。最后的混乱和糟糕的实现如下:

def getColsfromdb(supplier_name):
    client = MongoClient()
    db = client['supplier_static_database']
    map = Code("function(){   for (var key in this) {emit(key,null);} }") 
    reduce = Code("function(key, stuff) {return null;}")
    pT = getattr(db, supplier_name)
    mR = pT.map_reduce(map,reduce,supplier_name + "_keys")

    types_ = [type(v).__name__ for k,v in sorted(pT.find().limit(-1).skip(100).next().items())]

    cols4db = []
    for doc in mR.find():
        cols4db.append(doc["_id"])
    cols4db = sorted(cols4db)

    for i,t in enumerate(types_):
        if "unicode" in t:
            types_[i] = "string:50"
        if "ObjectId" in t:
            types_[i] = "id"
        if "list" in t or "NoneType" in t:
            types_[i] = "string:50"
        if "int" in t:
            types_[i]="int64"
        if "float" in t:
            types_[i]="float64"

    try:
        assert len(types_)==len(cols4db)
    except:
        tmpdiff = len(types_)-len(cols4db)
        if tmpdiff<0:
            for i in range(abs(tmpdiff)):
                types_.append("string:10")
        else:
            del cols4db[-tmpdiff:]

    return cols4db,types_

最初,每次失败时我都会except生成一个随机数,但我决定坚持使用&#34;随机选择&#34; 100.