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

MongoDB聚合Lookup管道匹配求助:获取最近低时间戳基准价

修改后的MongoDB聚合管道示例
db.trades.aggregate([
  // 第一步:生成K线数据(以1分钟粒度为例,可根据需求调整时间维度)
  {
    $group: {
      _id: {
        pair: "$pair",
        minute: { $dateTrunc: { date: "$tradeTime", unit: "minute" } }
      },
      open: { $first: "$relativePrice" },
      close: { $last: "$relativePrice" },
      high: { $max: "$relativePrice" },
      low: { $min: "$relativePrice" },
      lastTime: { $max: "$tradeTime" }
    }
  },
  // 第二步:关联BASEPRICE_BSC获取匹配的基准价
  {
    $lookup: {
      from: "BASEPRICE_BSC",
      // 定义变量引用当前K线的lastTime字段
      let: { kline_last_time: "$lastTime" },
      // 子管道筛选最近的符合条件的基准价
      pipeline: [
        {
          $match: {
            $expr: {
              // 匹配timestamp <= K线lastTime的基准价文档
              $lte: ["$timestamp", "$$kline_last_time"]
            }
          }
        },
        // 按时间倒序,最近的基准价排首位
        { $sort: { timestamp: -1 } },
        // 仅保留第一条(最近的)基准价
        { $limit: 1 },
        // 只返回需要的字段,减少冗余
        { $project: { _id: 0, basePrice: 1, timestamp: 1 } }
      ],
      // 匹配结果存入数组字段
      as: "matchedBasePrice"
    }
  },
  // 可选:将数组中的基准价提取为单个字段
  {
    $addFields: {
      basePrice: { $arrayElemAt: ["$matchedBasePrice.basePrice", 0] },
      basePriceTimestamp: { $arrayElemAt: ["$matchedBasePrice.timestamp", 0] }
    }
  },
  // 可选:移除临时数组字段
  { $project: { matchedBasePrice: 0 } }
])
关键用法解释

1. let变量的作用

let用于在$lookup中定义外部变量,这些变量直接引用当前聚合管道中正在处理的K线文档字段,语法为{ 变量名: "$当前文档字段名" }。
在$lookup的子管道中,必须用$$变量名的格式调用这些外部变量,避免和子集合(BASEPRICE_BSC)的字段混淆。

2. $expr结合$lte的用法

默认$match只能匹配固定值或子集合自身的字段,若需要比较子集合字段和外部变量,必须用$expr包裹比较逻辑。
这里$lte: ["$timestamp", "$$kline_last_time"]的含义是:判断BASEPRICE_BSC文档的timestamp是否小于等于K线的lastTime(通过外部变量$$kline_last_time引用),筛选出所有时间符合条件的基准价。

3. 筛选最近基准价的逻辑

  • 先用$match过滤出所有时间≤K线lastTime的基准价文档;
  • 再用$sort: { timestamp: -1 }按时间倒序排列,让最新的基准价排在第一位;
  • 最后用$limit:1仅保留第一条数据,即为离K线lastTime最近且符合条件的基准价。
注意事项
  • 确保BASEPRICE_BSC的timestamp和K线的lastTime为同类型时间格式(如ISODate),否则比较会失效;
  • 若BASEPRICE_BSC数据量较大,建议给timestamp字段建立索引,提升查询性能。

内容的提问来源于stack exchange,提问作者Skinsky Gnudy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 20:39:19