如何在Python中实现MongoDB嵌套查询:筛选高流动性股票缺失价格文档
解决方案
你可以通过两种方式实现需求:
方式一:分两步查询(简单直观)
先执行你已有的聚合逻辑获取高流动性股票的ta_id列表,再以此为条件筛选目标文档:
# 第一步:提取高流动性股票的ta_id集合 high_liquidity_ta_ids = [doc['ta_id'] for doc in adjPrices.aggregate([ { "$match": { "dint": {"$gte": 20221201} } }, { "$group": { "_id": "$ta_id", "avg_usd_vol": {"$avg": {"$multiply": ["$Volume", "$Close"]}} } }, { "$match": { "avg_usd_vol": {"$gte": 10000000} } }, { "$project": { "_id": 0, "ta_id": "$_id" } } ])] # 第二步:查询这些ta_id中存在价格字段为0的文档 target_docs = adjPrices.find({ "ta_id": {"$in": high_liquidity_ta_ids}, "$or": [ {"High": 0}, {"Low": 0}, {"Open": 0} ] })
方式二:单聚合管道完成(高效适用于大数据量)
利用$lookup关联集合自身,在一个管道内完成筛选和计算:
results = adjPrices.aggregate([ # 先筛选出所有High/Low/Open为0的文档 { "$match": { "$or": [ {"High": 0}, {"Low": 0}, {"Open": 0} ] } }, # 关联自身,计算当前ta_id的平均美元成交量 { "$lookup": { "from": "adjPrices", # 替换为你的实际集合名称 "let": {"current_ta_id": "$ta_id"}, "pipeline": [ { "$match": { "$expr": { "$and": [ {"$eq": ["$ta_id", "$$current_ta_id"]}, {"$gte": ["$dint", 20221201]} ] } } }, { "$group": { "_id": "$ta_id", "avg_usd_vol": {"$avg": {"$multiply": ["$Volume", "$Close"]}} } }, { "$match": { "avg_usd_vol": {"$gte": 10000000} } } ], "as": "liquidity_check" } }, # 只保留通过高流动性校验的文档 { "$match": { "liquidity_check": {"$ne": []} } }, # 可选:移除临时关联字段,恢复原始文档结构 { "$project": { "liquidity_check": 0 } } ])
注意事项
- 方式一逻辑清晰,适合数据规模较小的场景;方式二避免了两次查询的网络开销,更适合大数据量场景;
- 使用
$lookup时,from参数必须填写你的集合实际名称; - 你的SQL需求中
ON应为IN,对应MongoDB的$in操作符。
内容的提问来源于stack exchange,提问作者user3880490
相关产品推荐
相关产品推荐

