如何使用Monary从MongoDB集合中查询全部字段?
完全懂这种手动列十几个字段的痛苦!尤其是当集合字段多到数不过来的时候,手动输入不仅麻烦还容易漏。下面给你两种可行的方案,能自动获取集合的字段来喂给Monary:
方案一:通过样本文档快速获取字段(适合字段统一的集合)
如果你的properties集合里大部分文档的字段都一致,直接取一个样本文档就能提取所有字段,再搭配类型映射就搞定了:
from pymongo import MongoClient import Monary # 1. 先用pymongo连接MongoDB,拿到集合字段 mongo_client = MongoClient() db = mongo_client["static_database"] collection = db["properties"] # 取第一个文档当样本(如果集合很大,也可以用limit取几个再合并字段) sample_doc = collection.find_one({}) if not sample_doc: print("集合里没有数据哦!") exit() # 排除不需要的字段(比如默认的_id,按需调整) field_names = [key for key in sample_doc.keys() if key != "_id"] # 2. 定义字段类型映射,根据你的实际数据调整 def get_monary_type(field_value): if isinstance(field_value, str): return "string:72" # 和你之前用的字符串类型一致 elif isinstance(field_value, int): return "int32" elif isinstance(field_value, float): return "float64" # 有其他类型的话继续加,比如日期可以用"datetime64" else: return "string:72" # 不确定类型的话默认用字符串 # 生成对应字段的类型列表 field_types = [get_monary_type(sample_doc[key]) for key in field_names] # 3. 用Monary批量查询所有字段 monary_client = Monary() data = monary_client.query( "static_database", "properties", {}, # 你的查询条件,保持原有的即可 field_names, field_types )
方案二:用聚合获取所有可能的字段(适合字段不统一的集合)
如果集合里的文档字段不固定(有的文档有额外字段),可以用MongoDB的聚合管道把所有出现过的字段都捞出来:
from pymongo import MongoClient import Monary mongo_client = MongoClient() db = mongo_client["static_database"] collection = db["properties"] # 聚合管道:把文档转成键值对数组,然后去重收集所有键 pipeline = [ {"$project": {"data": {"$objectToArray": "$$ROOT"}}}, {"$unwind": "$data"}, {"$group": {"_id": None, "all_fields": {"$addToSet": "$data.k"}}}, {"$project": {"all_fields": 1, "_id": 0}} ] # 执行聚合,拿到所有字段 agg_result = list(collection.aggregate(pipeline)) if not agg_result: print("集合里没有数据哦!") exit() all_field_names = agg_result[0]["all_fields"] # 排除不需要的字段 all_field_names = [f for f in all_field_names if f != "_id"] # 这里可以参考方案一的类型映射逻辑,或者根据业务需求统一设置类型 # 比如如果大部分是字符串,直接批量生成类型列表 field_types = ["string:72"] * len(all_field_names) # 最后用Monary查询 monary_client = Monary() data = monary_client.query( "static_database", "properties", {}, all_field_names, field_types )
一些注意事项
- 类型映射一定要贴合实际数据:如果某个字段是数字类型,却用了
string:72,可能会导致数据读取异常,最好先确认核心字段的类型再调整映射函数。 - 如果有嵌套字段:Monary支持用点符号(比如
"Address.City")来查询嵌套字段,你只需要在字段列表里加上对应的路径,类型映射也要对应嵌套字段的实际类型。 - 性能考量:如果集合超级大,聚合获取所有字段可能会有点慢,这种情况下可以先取一部分样本文档来提取字段,能兼顾速度和准确性。
内容的提问来源于stack exchange,提问作者KugelBlitz
相关产品推荐
相关产品推荐

