我正在使用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,但未能找到解决方案。
答案 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.