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

MongoDB字符串转整数求和及10天内到期内容查询问题咨询

MongoDB查询问题解答

问题1:字符串类型字段转整数后求和

使用MongoDB聚合框架的$toInt操作符即可实现类型转换,若要兼容非法字符串、空值等异常场景,可以用$convert操作符设置默认值避免聚合中断。示例代码如下:

// 示例:对sales集合中字符串类型的amount字段求和
db.sales.aggregate([
  // 第一步:转换字段类型
  {
    $addFields: {
      amountInt: {
        // 基础写法,遇到非数字字符串会报错
        // $toInt: "$amount"
        // 兼容异常值写法
        $convert: { 
          input: "$amount", 
          to: "int", 
          onError: 0, // 转换失败返回0
          onNull: 0 // 字段为null返回0
        }
      }
    }
  },
  // 第二步:求和
  {
    $group: {
      _id: null,
      totalAmount: { $sum: "$amountInt" }
    }
  }
])

注:$toInt为MongoDB 4.0+版本支持的操作符,更低版本可使用$subtract: [{$toLong: "$amount"}, 0]的方式间接实现字符串转数值。


问题2:过滤符合到期条件的contents数组条目

需要通过聚合框架实现字段类型转换、日期计算、数组过滤三个步骤,示例代码如下:

// 先初始化今天的0点时间,避免时分秒干扰日期匹配
const today = new Date();
today.setHours(0, 0, 0, 0);

db.collection.aggregate([
  // 拆分contents数组,单个元素转为独立文档
  { $unwind: "$contents" },
  // 转换字段类型
  {
    $addFields: {
      // 字符串duration转整数
      "contents.durationInt": { $toInt: "$contents.duration" },
      // 字符串startDate转日期类型
      "contents.startDateDt": { $toDate: "$contents.startDate" }
    }
  },
  // 匹配符合逻辑的条目
  {
    $match: {
      $expr: {
        $and: [
          // 条件1:duration>10
          { $gt: ["$contents.durationInt", 10] },
          // 条件2:startDate + (duration-10)天 = 今天
          {
            $eq: [
              {
                // MongoDB 5.0+版本用$dateAdd
                $dateAdd: {
                  startDate: "$contents.startDateDt",
                  unit: "day",
                  amount: { $subtract: ["$contents.durationInt", 10] }
                }
                // 更低版本兼容写法,直接加毫秒数
                // $add: [
                //   "$contents.startDateDt",
                //   { $multiply: [{ $subtract: ["$contents.durationInt", 10] }, 86400000] }
                // ]
              },
              today
            ]
          }
        ]
      }
    }
  },
  // 可选:将匹配到的条目重新组装为数组返回
  {
    $group: {
      _id: "$_id",
      matchedContents: { $push: "$contents" }
    }
  }
])

若需要查询未来10天内到期的所有条目,只需将日期匹配的$eq替换为$gte+$lte的区间判断即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 23:42:02