You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:59:21