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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 06:55:16